检测最后一个 foreach 循环迭代

问题描述 投票:0回答:10

假设我有一些像这样的

foreach
循环:

Set<String> names = new HashSet<>();
//some code
for (String name: names) {
     //some code
}

有没有办法在没有计数器的情况下检查

foreach
内部的实际名称是
Set
中的最后一个? 我在这里没有找到这样的问题。

java algorithm collections
10个回答
85
投票

为了简单和易于理解,我会这样做:

Set<String> names = new HashSet<>();
Iterator<String> iterator = names.iterator();
    while (iterator.hasNext()) {
        String name = iterator.next();
        //Do stuff
        if (!iterator.hasNext()) {
            //last name 
        }
     }

此外,这取决于您想要实现的目标。假设您正在实现用逗号分隔每个名称的常见用例,但不在末尾添加空逗号:

Set<String> names = new HashSet<>();
names.add("Joao");
names.add("Pereira");
    
//if the result should be Joao, Pereira then something like this may work
String result = names.stream().collect(Collectors.joining(", "));

44
投票

其他答案是完全足够的,只需为给定的问题添加此解决方案即可。

Set<String> names = new HashSet<>();

   //some code
   int i = 0;

for (String name: names) {
    if(i++ == names.size() - 1){
        // Last iteration
    }
   //some code

}

28
投票

没有,看一下Java的“foreach”循环是如何工作的?

您必须更改循环以显式使用迭代器或 int 计数器。


4
投票

如果您正在使用一个复杂的对象而不仅仅是一个简单的列表/设置,下面的代码可能会有所帮助。只需添加一个映射函数即可在收集之前实际获取所需的字符串。

String result = violations.stream().map(e->e.getMessage()).collect(Collectors.joining(", "));

4
投票

是的,有一种方法可以在

foreach
内部检查它,使用计数器:

Set<String> names = new HashSet<>();

int i = names.size() - 1;
for (String name: names) {
    if (i-- == 0) {
        // some code for last name
    }
    //some code
}

考虑一下,

names.size()
仅在循环外被调用一次。这使得循环比在循环内多次处理它更快。


0
投票

没有内置方法来检查当前元素是否也是最后一个元素。除此之外,您使用的是

HashSet
,它不能保证退货订单。即使您想检查它,例如使用索引
i
最后一个元素可能总是不同的。


0
投票

A

Set
不保证其中商品的订单。 您可以循环遍历
Set
一次并检索“abc”作为“最后一项”,下次您可能会发现“hij”是
Set
中的“最后一项”。

话虽这么说,如果您不关心顺序,而只是想知道在当前时刻观察

Set
时任意的“最后一项”是什么,则没有内置方法可以做到这一点。 您必须使用计数器。


0
投票
上面答案中的

.map(String::toString) 是多余的,因为 HashSet 已经包含 String 值。不要使用 Set 来连接字符串,因为顺序不确定。

List<String> nameList = Arrays.asList("Michael", "Kate", "Tom");
String result = nameList.stream().collect(Collectors.joining(", "));

0
投票

有一种简单的方法可以通过抛出一个条件来完成此操作。 认为这是你的数组:

int odd[] = {1,3,5,7,9,11};

并且您想将其全部打印在一行中,除了最后一行之外,中间用“-”连字符。

for(int aa:odd) {
    System.out.print(aa);
            
    if(odd[odd.length - 1] != aa)
        System.out.print(" - ");
}

这个条件

if( odd[odd.length - 1] != aa )

会检查你是否不在最后一个元素中,所以你仍然可以添加“-”,否则你不会添加它。


0
投票
    List<String> list = Arrays.asList("1", "2", "3");
    for (String each : list) {
        if (list.indexOf(each) == (list.size() - 1)) {
            System.out.println("last loop");
        }
    }

注意:Set 不是有序集合。

© www.soinside.com 2019 - 2024. All rights reserved.