【问题标题】:Java returning a loopJava返回一个循环
【发布时间】:2011-12-09 14:52:33
【问题描述】:

我想让我的类返回一个值,但我希望该值像循环一样基于更改。我认为我的代码会比我能更好地解释它。

    public static String readChat(String value) throws Exception
{
    FormatS FormatS = new FormatS();

    BufferedReader mainChat = new BufferedReader(new FileReader("./chat.txt"));
    String str;
    while ((str = mainChat.readLine()) != null) 
    {
        String msg = FormatS.FormatS(str, value);
    }
    mainChat.close();
return (msg);

不幸的是,它只会返回最后一个,因为不会返回循环,而只会返回循环中的最后一条消息,我怎样才能让它返回循环中的每个值作为单独的返回? (如果可能从这里开始而不影响其他类)

【问题讨论】:

  • 我相信你将不得不在调用方法的循环中调用这个方法。其他选项是使用分隔符连接字符串并返回整个字符串。

标签: java loops return


【解决方案1】:

有两种简洁的方法可以让一个方法将多个返回值传达给调用者。

第一种也是最简单的方法是返回一个包含所有返回值的对象。它可能是一个集合,例如一个列表,也可能是您自己的值类的对象。

 List<Person> matches = findMatches(peopleDB,criteria);
 MatchReport report = findMatchesAsReport(peopleDB);

...

 public List<Person> findMatches(PersonSource source,Criteria criteria) {
      List<Person> list = new ArrayList<Person>();
      while(source.hasNext()) {
          Person person = source.next();
          if(person.matches(criteria)) {
              list.add(person);
          }
      }
      return list;
 }

第二种更复杂的方法是定义一个handler,您的方法可以在遇到项目时将其交给它。

    public interface PersonHandler {
          public void onPerson(Person p);
    }

然后您定义您的方法,以便将处理程序传递给它:

    public void findMatches(PeopleSource source, Criteria criteria, PersonHandler handler) {
          while(source.hasNext()) {
             Person person = source.next();
             if(person.matches(criteria)) {
                handler.onPerson(person);
             }
          }
    }

然后调用者可以定义一个 PersonH​​andler 来满足他们自己的需要:

   private static class PrintToWriterPersonHandler implements PersonHandler {
       private PrintWriter writer;
       public WriteToStreamPersonHandler(PrintWriter writer) {
           this.writer = writer;
       }
       public void onPerson(Person p) {
           writer.println(person);
       }
   }

...

   findMatches(source,criteria,new PrintToWriterPersonHandler(System.out));

这对于初学者来说非常复杂且复杂。但值得牢记。这意味着您可以处理产生大量响应的方法,而不必等到方法完成,也不会在内存中产生巨大的 List。这也意味着您可以处理可能无限期运行的方法的输出!

【讨论】:

    【解决方案2】:

    如果您想让该方法在每次调用时返回不同的内容,则需要存储该方法的状态 - 这特别不幸,因为它是一个静态方法。

    在我看来,返回 Iterable&lt;String&gt; 更合适——您可以迭代的单个对象,例如带有增强的for 循环。

    一种简单的方法是读取整个文件,将其加载到List&lt;String&gt;,然后返回。 Guava 提供了一种非常简单的方法:

    // Use the appropriate charset, of course - but the default platform encoding
    // is rarely a good idea.
    List<String> lines = Files.readLines(new File("chat.txt", Charsets.UTF_8));
    
    List<String> formattedLines = Lists.newArrayList();
    for (String line : lines) {
        formattedLines.add(FormatS.FormatS(line, value));
    }
    return formattedLines;
    

    (顺便说一句,FormatS.FormatS 是一个很奇怪的方法名……)

    在 Guava 中有其他方法可以做到这一点,例如传入LineProcessor - 但如果您对 Java 比较陌生,这可能是一个更简单的起点。

    【讨论】:

      【解决方案3】:

      您必须从调用方法重复调用此方法。更好的方法是将内容存储在 String 数组中并返回该数组,而无需多次调用此方法。

      private String[] strBuff;
      while ((str = mainChat.readLine()) != null) 
      {
          strBuff[i] = FormatS.FormatS(str, value);
      }
      return strBuff;
      

      【讨论】:

        【解决方案4】:

        每次调用都将返回下一行,如果没有更多行则返回 null(如果您需要的话):

        static BufferedReader mainChat = new BufferedReader(new FileReader("./chat.txt"));
        static boolean finished = false;
        
        public static String readChat(String value) throws Exception
        {
            FormatS FormatS = new FormatS();
        
            if(finished) {
                return null;
            }
        
            String str;
            if ((str = mainChat.readLine()) != null) 
            {
                return FormatS.FormatS(str, value);
            } else {
                finished = true;
                mainChat.close();
                return null;
            }
        }
        

        请注意,如果您想多次使用它,则必须创建一个单独的(重新)初始化函数。

        【讨论】:

          【解决方案5】:

          创建一个数组,将每个值作为一个单独的项放入数组中,然后返回该数组。或者在循环中将新值附加到 msg 上:

              msg += FormatS.FormatS(str, value);
          

          在循环外启动 msg。

          【讨论】:

            【解决方案6】:

            你不能。 Java 方法只返回一个值,不能多次返回。 在 return 语句之后,你就退出了那个方法!

            您可以使用集合(例如列表)来存储您的所有消息,然后返回列表。

            http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

            在此处查看有关集合的更多信息。如果您是 Java 新手并打算坚持使用它,那么掌握它是一个非常重要的方面:)。

            你应该做的是实例化一个新的集合,例如:

            List<String> messageList = new ArrayList<String>();
            

            然后在你的循环中,你会做......

            messageList.add(msg);
            

            当然还有大结局……

            return messageList;
            

            在“外部”方法(调用者)中,您可以对列表进行交互,并根据需要使用消息。

            【讨论】:

              猜你喜欢
              • 2023-03-10
              • 1970-01-01
              • 2012-10-16
              • 2014-01-24
              • 2013-04-25
              • 1970-01-01
              • 2016-09-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多