是否有可能在增强的for循环中找到当前索引?

rgk*_*gan 35 java for-loop

是否有可能在增强的for循环中找到当前索引?如果是这样的话?

我知道我们可以用一个额外的变量检查它.但还有其他方法.

public boolean cancelTicket(Flight f, Customer c) {
    List<BookingDetails> l = c.getBooking();
    if (l.size() < 0) {
        return false;
    } else {
        for (BookingDetails bd : l) {
            if(bd.getFlight()==f){
                l.remove()  // Index here..
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 33

是否有可能在增强的for循环中找到当前索引?

不.如果您需要索引,我建议您使用普通的for循环.

但是,在这种情况下,您实际上似乎不需要索引.除非你正在处理一些非常奇怪的列表类型,否则你可以使用Iterator和使用Iterator.remove()方法,如下所示:

public boolean cancelTicket(Flight f, Customer c) {
    Iterator<BookingDetails> bdIter = c.getBooking().iterator();

    if (!bdIter.hasNext())
        return false;

    while (bdIter.hasNext())
        if (bdIter.next().getFlight() == f)
            bdIter.remove();

    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • "在这种特殊情况下你不需要删除操作的索引" - 而且,你*不能*使用索引进行删除操作,因为如果这样做,你将得到一个`ConcurrentModificationException`.正如aioobe所说,正确的方法是使用`Iterator.remove()`. (6认同)

小智 13

是的,在for语句之前使用计数器.因此:

int i = 0;
for (int s : ss)
{
   // Some Code
   System.out.println(i);

   i++;
}
Run Code Online (Sandbox Code Playgroud)


小智 11

是否有可能在增强的for循环中找到当前索引?

要获取索引,您可以使用List.indexOf(object).

我已经使用这些技术来获取列表中当前对象的索引.例如,您在上面给出的,可以使用两种方式完成删除.

  • 使用对象实例删除对象.
 public boolean cancelTicket(Flight f, Customer c) {
        List<BookingDetails> l = c.getBooking();
        if (l.size() < 0) {
            return false;
        } else {
            for (BookingDetails bd : l) {
                if(bd.getFlight()==f){
                    l.remove(bd)  // Object Instance here..
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)
  • 使用List.indexOf(索引)
 public boolean cancelTicket(Flight f, Customer c) {
        List<BookingDetails> l = c.getBooking();
        if (l.size() < 0) {
            return false;
        } else {
            for (BookingDetails bd : l) {
                if(bd.getFlight()==f){
                    l.remove(l.indexOf(bd))  // index Number here..
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • List.indexOf是O(n)所以我尽量避免使用它. (8认同)
  • 此外,indexOf始终返回列表中对象的第一次出现,这可能不是您想要的. (3认同)
  • 读者请注意!这绝对不是一条路!这不仅非常慢(O(n^2)),而且可能不正确(例如,对于列表中的重复值)。 (3认同)