繁体   English   中英

检测最后一次 foreach 循环迭代

[英]detect last foreach loop iteration

假设我有一些这样的foreach循环:

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

有没有办法在没有计数器的情况下检查foreach的实际名称是Set中的最后一个? 我没有在这里找到这样的问题。

为了简单和易懂,imo 会这样做:

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

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

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(", "));

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

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

   //some code
   int i = 0;

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

}

没有,看看Java 'for each' 循环是如何工作的?

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

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

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

没有内置方法来检查当前元素是否也是最后一个元素。 除此之外,您使用的是不保证退货顺序的HashSet 即使您想检查它,例如使用索引i ,最后一个元素也可能总是不同的。

Set不保证其中的项目的顺序。 您可以遍历Set一次并检索“abc”作为“最后一项”,下次您可能会发现“hij”是Set的“最后一项”。

话虽如此,如果您不关心顺序,而只想知道在当前时刻观察Set时任意的“最后一项”是什么,则没有内置的方法可以做到这一点。 您将不得不使用计数器。

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

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

有一种简单的方法可以做到这一点,抛出一个条件。 考虑这是你的数组:

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 )

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

是的,有一种方法可以通过使用计数器在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()在循环外只被调用一次。 这使得循环比在循环内多次处理它更快。

    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 不是有序集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM