我不知道如何在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
return; //returns the void
}
msg += "--::" + users.get(i).name + brln; // do this by default
}
你能帮我解决这个问题吗?
答案 0 :(得分:4)
您的情况有误:代替(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;
}
这会在除第一行之外的每一行之前添加换行符。注意条件如何更容易。
答案 1 :(得分:2)
如果您需要最后一个索引,请使用if( i == users.size()-1)
在您提供的示例中,您应该使用StringBuilder进行字符串连接。然后你只需要循环而不询问任何东西,你可以使用for-each
循环。
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);
}
答案 2 :(得分:2)
改变这个 从:
if((i - 1) == users.size()){
为:
if((i + 1) == users.size()){
答案 3 :(得分:2)
您想要生效的是由分隔符分隔的一系列条目,其中分隔符是换行符。使用这个成语:
String delimiter = "", result = "";
for (...loop init...) {
result += delimiter;
...append one entry...
delimiter = brln;
}
除此之外,通过在每次迭代中创建新字符串来构建大字符串对于性能是不利的,因为它是O(n ^ 2)操作。您应该更喜欢StringBuilder
。
答案 4 :(得分:2)
如果稍微更改一下代码,可以避免出现特殊情况:
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
来连接循环中的字符串,就像我上面所做的那样。
(此解决方案适用于您的情况,因为您有一个包含换行符的标题。请参阅其他解决方案,了解在每次出现之间插入字符串X的通用方法,但是循环中的最后一个)。
答案 5 :(得分:1)
将您的条件更改为
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
}
答案 6 :(得分:1)
if((i - 1) == users.size())
这一个:
if(i == (users.size()-1))
答案 7 :(得分:0)
虽然这对你来说可能没什么帮助(当你不使用Java 8时),所有这些凌乱的代码都将以Java 8结束:
// requires Java 8
String msg = users.stream().map(User::name).collect(Collectors.joining(brln));