【问题标题】:Is it possible to find the present index in an enhanced for loop? [duplicate]是否可以在增强的 for 循环中找到当前索引? [复制]
【发布时间】:2011-12-02 22:43:02
【问题描述】:

是否可以在增强的 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..
            }
        }
    }
}

【问题讨论】:

  • 这没有任何意义:if (list.size() &lt; 0)。也许你的意思是==?
  • 即使您确实有索引,尝试在增强的 for 循环中从列表中删除元素也会导致 ConcurrentModificationException。使用@aioobe 建议的迭代器

标签: java for-loop


【解决方案1】:

是的,在 for 语句之前使用计数器。 像这样:

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

   i++;
}

【讨论】:

  • 最佳和最有效的答案 ;-)
【解决方案2】:

是否可以在增强的 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;
}

【讨论】:

  • "在这种特殊情况下,您不需要索引来进行删除操作" - 此外,您不能将索引用于删除操作,因为如果你这样做,你会得到一个ConcurrentModificationException。正如 aioobe 所说,正确的做法是使用Iterator.remove()。
【解决方案3】:

是否可以在增强的 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..
                }
            }
        }
    }
  • 使用 List.indexOf(index)
 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..
                }
            }
        }
    }

【讨论】:

  • List.indexOf 是 O(n) 所以我尽量避免使用它。
  • 另外,indexOf 总是返回对象在列表中的第一次出现,这可能不是你想要的。
  • 读者当心!这绝对不是要走的路!这不仅非常慢 (O(n^2)),而且可能不正确(例如,对于列表中的重复值)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多