检测最后的 foreach 循环迭代

假设我有这样的 foreach循环:

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

有没有一种方法来检查内部 foreach的实际名称是最后一个在 Set没有计数器?我在这里找不到这样的问题。

117881 次浏览

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

没有,看看 Java 是如何为每个循环工作的?

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

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

也就是说,如果你不关心顺序,你只是想知道在当前时刻观察 Set的任意“最后一项”是什么,没有内置的方式来做这件事。你必须使用计数器。

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

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


//some code
int i = 0;


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


}

为了简单易懂起见,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
}
}

而且,这取决于你想要达到什么样的目标。假设您正在实现一个常见的用例,即通过昏迷分隔每个名称,但不在最后添加一个空昏迷:

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

.map(String::toString) from the answer above is redundant, because HashSet already contains String values. Do not use Set to concatenate strings because the order is not assured.

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

如果您使用的是一个复杂的对象,而不仅仅是一个普通的列表/设置下面的代码可能会有所帮助。只需添加一个 map 函数,就可以在收集之前实际获得所需的字符串。

String result = violations.stream().map(e->e.getMessage()).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 不是有序集合。