Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何让这个for循环正常工作?_Java_For Loop - Fatal编程技术网

Java 我如何让这个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

我不知道如何在这个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
}
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();