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

Java 是否可以在增强的for循环中找到当前索引?,java,for-loop,Java,For Loop,是否可以在增强的for循环中找到当前索引?如果是,怎么做 我知道我们可以用一个额外的变量来检查它。但是还有别的办法吗 public boolean cancelTicket(Flight f, Customer c) { List<BookingDetails> l = c.getBooking(); if (l.size() < 0) { return false; } else { for (BookingDetail

是否可以在增强的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..
            }
        }
    }
}
公共机票(f航班,客户c){
列表l=c.getBooking();
如果(l.size()<0){
返回false;
}否则{
对于(预订详细信息bd:l){
如果(bd.getFlight()==f){
l、 remove()//在此处建立索引。。
}
}
}
}
是否可以在增强的for循环中找到当前索引?

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

然而,在这种情况下,您实际上似乎并不需要索引。除非您处理的是某种非常奇怪的列表类型,否则可以使用
迭代器
并使用
迭代器.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;
}
公共机票(f航班,客户c){
迭代器bdIter=c.getBooking().Iterator();
如果(!bdIter.hasNext())
返回false;
while(bdIter.hasNext())
if(bdIter.next().getFlight()==f)
b iter.remove();
返回true;
}
是否可以在增强的for循环中找到当前索引?

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

我使用了这些技术来获取列表中当前对象的索引。 例如,您在上面给出的示例中,可以使用两种方法进行删除

  • 使用对象实例删除对象
公共机票(f航班,客户c){
列表l=c.getBooking();
如果(l.size()<0){
返回false;
}否则{
对于(预订详细信息bd:l){
如果(bd.getFlight()==f){
l、 remove(bd)//此处的对象实例。。
}
}
}
}
  • 使用List.indexOf(索引)
公共机票(f航班,客户c){
列表l=c.getBooking();
如果(l.size()<0){
返回false;
}否则{
对于(预订详细信息bd:l){
如果(bd.getFlight()==f){
l、 删除(l.indexOf(bd))//此处的索引号。。
}
}
}
}

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


这没有任何意义:
if(list.size()<0)
。也许你的意思是
==
?检查这个。即使您确实有索引,尝试在增强的for循环中从列表中删除元素也会导致ConcurrentModificationException。使用@aioobe建议的迭代器“尽管在这种特殊情况下,删除操作不需要索引”-此外,您不能将索引用于删除操作,因为如果这样做,您将得到
ConcurrentModificationException
。正如aioobe所说,正确的方法是使用
Iterator.remove()
.List.indexOf是O(n),所以我尽量避免在一般情况下使用它。此外,indexOf总是返回列表中对象的第一次出现,这可能不是您想要的。读者小心!这绝对不是办法!这不仅非常慢(O(n^2)),而且可能不正确(例如,对于列表中的重复值)。最佳和最有效的答案;-)
 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..
                }
            }
        }
    }
 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..
                }
            }
        }
    }
int i = 0;
for (int s : ss)
{
   // Some Code
   System.out.println(i);

   i++;
}