【问题标题】:Using for : each loop to return multiple Strings nestled in an ArrayList使用 for :每个循环返回多个嵌套在 ArrayList 中的字符串
【发布时间】:2015-09-19 05:57:58
【问题描述】:

我正在尝试使用以下方法返回运动队中的所有“球员及其目标”:

public String printPlayers(){        
    for (Player player : this.players){
        return player.toString();
    }
}

Netbeans 说没有 return 语句,我认为这是因为它在 for-each 循环中。但如果我把它放在外面,它只会返回一件。下面是测试代码:

    Team barcelona = new Team("FC Barcelona");

    Player brian = new Player("Brian");
    Player pekka = new Player("Pekka", 39);

    barcelona.addPlayer(brian);
    barcelona.addPlayer(pekka);
    barcelona.addPlayer(new Player("Mikael", 1));

    barcelona.printPlayers();

在 Player 对象中,toString 的作用如下:

public String toString(){
        return ("Player: "+this.name+", goals "+this.goals);
    }

【问题讨论】:

    标签: java for-loop arraylist


    【解决方案1】:

    Java 允许您只返回一个对象。不可能返回多个对象。如果要从单个方法返回多个对象,首先必须将它们收集到单个对象中,例如数组、ListString,然后返回。

    让我们看看你的代码。 Netbeans 抱怨缺少 return 语句,因为您的 players 集合可能为空。在这种情况下,循环块永远不会执行,并且方法结束时没有 return 语句,这是不允许的。因此,让我们按如下方式修复您的方法:

    public String printPlayers(){        
        for (Player player : this.players){
            return player.toString();
        }
        return "";
    }
    

    现在该方法只返回一个对象:它将集合中的第一个播放器转换为字符串,然后返回。其他玩家被忽略。因此,您必须将您的玩家收集在一个对象中。既然要返回一个字符串,那么将字符串收集在一个字符串中是有意义的:

    public String printPlayers(){        
        String result = "";
        for (Player player : this.players){
            result += " " + player.toString();
        }
        return result;
    }
    

    现在您可以尝试使结果更好,例如通过删除第一个元素的前导空格,或添加逗号而不是空格等。此外,为了获得更高的性能,您可以使用StringBuilder 来构建您的字符串(但是一旦你有了工作方法,就要考虑性能!)。

    【讨论】:

    • 你得到了我的投票,至少解释了为什么代码不能编译以及为什么在循环中返回是不正确的。如果您使用 StringBuilder,我仍然更喜欢。这不会使代码更难理解或更长。
    • 谢谢霍普杰。这是完全有道理的,我已经测试了代码的其他组件,并且它们按预期工作,因此带有用于格式化的谷歌搜索“\n”的 += 字符串很有魅力。我也喜欢关于在工作后考虑性能的说明。作为初级程序员,这些技巧很有帮助!谢谢。
    【解决方案2】:
     public String printPlayers(){        
      String data="";
     for (Player player : this.players){
           data +=player.toString();
      }
          return data;
    }
    

    【讨论】:

    • 永远不要在循环中使用String + String 构建字符串。使用StringBuilder
    • 它会继续在后端创建字符串,对吧? @安德烈亚斯
    • Andreas, @DanyalSandeelo 这不是一个有效的观点。编译器会处理它:codeinventions.blogspot.in/2014/08/…
    • @sᴜʀᴇsʜᴀᴛᴛᴀ 不在循环中。一个更好的选择是return players.stream().map(Player::toString).collect(Collectors.joining(", ");
    【解决方案3】:

    使用 StringBuilder

    public String printPlayers(){ 
        StringBuilder sb = new StringBuilder();       
        for (Player player : this.players){
          sb.append(player.toString());
        }
        return sb.toString();
    }
    

    【讨论】:

      【解决方案4】:

      为什么netbeans抱怨是,如果你不进入for循环怎么办?所以应该总是有回报。

      进入实际问题,

      只需构建一个字符串并返回

      public String printPlayers(){   
              StringBuilder builder=new StringBuilder();     
              for (Player player : this.players){
                  builder.append(player).append(" ");
              }
             return builder.toString();
          }
      

      这是构建一个字符串,将所有玩家作为字符串附加并最终返回。

      【讨论】:

      • 永远不要在循环中使用String + String 构建字符串。使用StringBuilder
      • @Andreas 谁告诉的?该编译器会小心的 :) 阅读 codeinventions.blogspot.in/2014/08/…
      • @sᴜʀᴇsʜᴀᴛᴛᴀ 不在循环中。只有在使用单个指令时才会这样做:String foo = bar + baz + ding;
      • @JBNizet 好的,不要这样。那么,为什么会这样?它在循环和普通语句中有何不同?
      • 循环内部的另一项改进:builder.append(player).append(' '); --- append(Object) 自动调用 toString()append(char) 优于 append(String)。次要考虑,但仍然。 ;-)
      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2012-01-23
      相关资源
      最近更新 更多