假设我有这样的foreach
循环:
Set<String> names = new HashSet<>();
//some code
for (String name: names) {
//some code
}
有没有办法在foreach
内检查实际名称是Set
中没有计数器的最后一个?
(对不起,如果它是一个重复的问题,我在这里找不到这样的问题)
答案 0 :(得分:18)
为了简单易懂,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(", "));
答案 1 :(得分:14)
没有,请看How does the Java 'for each' loop work?
您必须更改循环以显式使用迭代器或使用int计数器。
答案 2 :(得分:10)
其他问题完全足够,只需为给定问题添加此解决方案。
Set<String> names = new HashSet<>();
//some code
int i = 0;
for (String name: names) {
if(i++ == names.size() - 1){
// Last iteration
}
//some code
}
答案 3 :(得分:0)
没有构建方法来检查当前元素是否也是最后一个元素。除此之外,您使用的HashSet
不保证退货订单。即使你想检查它,例如索引i
的最后一个元素可能总是不同的。
答案 4 :(得分:0)
Set
不保证其中的商品的订单。您可以遍历Set
一次并检索&#34; abc&#34;作为&#34;最后一项&#34;下次你可能会发现&#34; hij&#34;是&#34;最后一项&#34;在Set
。
话虽如此,如果你不关心秩序,你只想知道什么是任意的&#34;最后一项&#34;就是在当前时刻观察Set
时,没有内置的方法来做到这一点。你必须使用一个柜台。
答案 5 :(得分:0)
.map(String :: toString)是多余的,因为HashSet已经包含字符串值。不要使用Set来连接字符串,因为不能保证顺序。
List<String> nameList = Arrays.asList("Michael", "Kate", "Tom");
String result = nameList.stream().collect(Collectors.joining(", "));
答案 6 :(得分:0)
如果您使用的是复杂对象,而不仅仅是简单的列表/集,则下面的代码可能会有所帮助。只需添加一个map函数即可在收集之前实际获取所需的字符串。
String result = violations.stream().map(e->e.getMessage()).collect(Collectors.joining(", "));
答案 7 :(得分: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 )
将检查您是否不在最后一个元素中,因此您仍可以添加“-”,否则将不添加它。