如何使循环工作正常?

时间:2014-01-13 14:17:10

标签: 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
            return; //returns the void
    }
    msg += "--::" + users.get(i).name + brln; // do this by default
}

你能帮我解决这个问题吗?

8 个答案:

答案 0 :(得分:4)

您的情况有误:代替(i - 1) == users.size()使用(i + 1) == users.size()i == users.size() - 1

基本上(i - 1) == users.size()会匹配最后一个元素(显然不存在),即对于大小为5的列表,您将获得(i - 1) == 5i == 6

在上面的示例中,(i + 1) == users.size()i == users.size() - 1将解析为(i + 1) == 5i == 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));