Java 我如何让这个for循环正常工作?
我不知道如何在这个for循环的最后一个循环中执行特定的操作:Java 我如何让这个for循环正常工作?,java,for-loop,Java,For Loop,我不知道如何在这个for循环的最后一个循环中执行特定的操作: String msg = "---Player List, Count:" + users.size() + "---" + brln; for (int i = 0; i < users.size(); i++) { if((i - 1) == users.size()){ msg += "--::" + users.get(i).name; //Do this at the last loop
String msg = "---Player List, Count:" + users.size() + "---" + brln;
for (int i = 0; i < users.size(); i++) {
if((i - 1) == users.size()){
msg += "--::" + users.get(i).name; //Do this at the last loop
return; //returns the void
}
msg += "--::" + users.get(i).name + brln; // do this by default
}
String msg=“---玩家列表,计数:“+users.size()+”--“+brln;
对于(int i=0;i
你能帮我实现这个吗?如果你需要最后一个索引,只需使用
If(i==users.size()-1)
在您提供的示例中,应该使用for字符串串联。然后,您只需要循环而不询问任何问题,并且可以对每个循环使用
StringBuilder msg =new StringBuilder().append("---Player List, Count:").append(users.size()).append("---");
for (User user : users) {
msg.append(brln)
.append("--::").append(user.name)
.append(brln);
}
您的条件是错误的:使用(i+1)=users.size()
而不是(i+1)==users.size()
或i==users.size()-1
基本上,(i-1)==users.size()
将匹配最后一个(显然不存在)之后的元素,即对于大小为5的列表,您将得到(i-1)==5
或i==6
在上面的示例中,(i+1)=users.size()
和i==users.size()-1
将解析为(i+1)==5
和i==5-1
,这两种方法都会导致i==4
,这是列表中的最后一个索引
编辑:顺便说一句,你的循环仍然很奇怪。基本上,除了最后一个元素之外,每个元素后面都添加了一个换行符。为什么不改成这样:
String msg = "---Player List, Count:" + users.size() + "---" + brln;
for (int i = 0; i < users.size(); i++) {
if( i > 0){
msg += brln;
}
msg += "--::" + users.get(i).name;
}
String msg=“---玩家列表,计数:“+users.size()+”--“+brln;
对于(int i=0;i0){
msg+=brln;
}
msg+=“-:”+users.get(i).name;
}
这将在除第一行之外的每行之前添加换行符。请注意条件是多么简单。将条件更改为
i == users.size() - 1
为什么??在Java(和其他语言)中,列表中的第一个元素位于索引0处,最后一个元素位于N-1处(如果N是列表中当前的元素数),因此users.size()-1是最后一个元素的索引。例如,如果用户列表中有10个元素,那么最后一个元素将位于索引9
完整代码:
String msg = "---Player List, Count:" + users.size() + "---" + brln;
for (int i = 0; i < users.size(); i++) {
//if i equals to the last index, do your special handling of the loop
if(i == (users.size() - 1)) {
msg += "--::" + users.get(i).name; //Do this at the last loop
break;
}
msg += "--::" + users.get(i).name + brln; // do this by default
}
String msg=“---玩家列表,计数:“+users.size()+”--“+brln;
对于(int i=0;i
更改此选项
发件人:
致:
你做错了。更改您的线路:
if((i - 1) == users.size())
通过这个:
if(i == (users.size()-1))
实际上,您需要的是一个由分隔符分隔的条目字符串,其中分隔符是换行符。用这个成语:
String delimiter = "", result = "";
for (...loop init...) {
result += delimiter;
...append one entry...
delimiter = brln;
}
除此之外,通过在每次迭代中创建新字符串来构建一个大字符串对性能不利,因为这是一个O(n^2)操作。您应该更喜欢StringBuilder
,尽管这可能对您现在没有帮助(当您不使用Java 8时),但所有这些混乱的代码都将以Java 8结束:
// requires Java 8
String msg = users.stream().map(User::name).collect(Collectors.joining(brln));
如果稍微更改代码,可以避免特殊情况:
StringBuilder msg = new StringBuilder("---Player List, Count:" + users.size()
+ "---"); // Note a lack of brln
for (int i = 0; i < users.size(); i++) {
msg.append(brln + "--::" + users.get(i).name);
}
return msg.toString();
StringBuilder msg=new StringBuilder(“---玩家列表,计数:”+users.size()
+ "---"); // 注意缺少brln
对于(inti=0;i
理想情况下,您应该使用StringBuilder
在循环中串联字符串,正如我在上面所做的那样
(此解决方案适用于您的情况,因为您有一个包含换行符的标题。请参阅其他解决方案,了解在循环中的每次出现之间插入字符串X的一般方法,但最后一次除外)。仅为用户循环。size()-1次,然后执行最后一位如何?我不能这样做,因为它使用了forloop@FFlaser好。。你知道它有什么价值。@Duncan,因为它总是最后一项!不需要i
大多数情况下,我会以与您相同的方式解决该问题。我也真的很想看到一种更优雅的方式:—)+1也来自我。我收回上面(在问题下)的评论。我想我会发现这更具可读性。但现在,我看到这一点有点发抖。是的,也许一个人需要先适应它。但更让我不寒而栗的是,这样一个小问题让大约10个人讨论它!因此,我认为,每一个更简单、更不容易出错的解决方案都是受欢迎的
// requires Java 8
String msg = users.stream().map(User::name).collect(Collectors.joining(brln));
StringBuilder msg = new StringBuilder("---Player List, Count:" + users.size()
+ "---"); // Note a lack of brln
for (int i = 0; i < users.size(); i++) {
msg.append(brln + "--::" + users.get(i).name);
}
return msg.toString();