Java возвращает цикл - PullRequest
       27

Java возвращает цикл

0 голосов
/ 18 октября 2011

Я хочу, чтобы мой класс возвращал значение, но я хочу, чтобы это значение изменялось в зависимости от цикла. Я думаю, что мой код объяснит это лучше, чем я.

    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);

К сожалению, это будет возвращать только последнее, поскольку цикл не возвращается, а только последнее сообщение в цикле. Как я могу сделать так, чтобы оно возвращало каждое значение в цикле как отдельный возврат? (Если возможно отсюда, не затрагивая другие классы)

Ответы [ 6 ]

4 голосов
/ 18 октября 2011

Вы не можете.Метод 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;

В методе "снаружи"(вызывающий абонент), вы можете взаимодействовать со списком и использовать сообщения для своих нужд.

2 голосов
/ 18 октября 2011

Создайте массив, поместите каждое значение как отдельный элемент в массив, а затем верните массив.Или добавьте новое значение в сообщение в цикле:

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

Инициируйте сообщение вне цикла.

1 голос
/ 18 октября 2011

Если вы хотите, чтобы метод возвращал разную вещь каждый раз, когда вы вызываете его, вам необходимо сохранить состояние метода - что особенно прискорбно, поскольку это статический метод.

Мне кажется, что было бы более целесообразно вернуть Iterable<String> - единственный объект, по которому вы можете перебирать, например, с помощью расширенного цикла for.

Один простой способ сделатьто есть прочитать весь файл, загрузить его в List<String> и затем вернуть его. Гуава предоставляет очень простой способ сделать это:

// 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 довольно странное имя метода ...)

Тамальтернативные способы сделать это в Гуаве, например, передать LineProcessor - но если вы относительно новичок в Java, это, вероятно, более простая отправная точка.

0 голосов
/ 17 марта 2014

Существует два простых способа заставить метод передавать множественные возвращаемые значения вызывающей стороне.

Первый и самый простой способ - вернуть объект, который содержит все возвращаемые значения. Это может быть коллекция, например список, или объект вашего собственного класса значений.

 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;
 }

Второй, более сложный способ - определить обработчик , которому ваш метод может передавать элементы при их обнаружении.

    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);
             }
          }
    }

Затем вызывающий абонент может определить PersonHandler, который отвечает их собственным потребностям:

   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));

Это довольно сложно и сложно для новичка. Но это стоит иметь в виду. Это означает, что вы можете иметь дело с методами, которые генерируют огромное количество ответов, без необходимости ждать завершения метода и без огромного списка в памяти. Это также означает, что вы можете иметь дело с выводом из метода, который может выполняться бесконечно!

0 голосов
/ 18 октября 2011

Вы должны вызывать этот метод повторно из вызывающего метода.Лучше было бы хранить содержимое в массиве String и возвращать массив, не вызывая этот метод несколько раз.

private String[] strBuff;
while ((str = mainChat.readLine()) != null) 
{
    strBuff[i] = FormatS.FormatS(str, value);
}
return strBuff;
0 голосов
/ 18 октября 2011

Каждый вызов вернет следующую строку или ноль, если строк больше нет (если это то, что вам нужно):

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;
    }
}

Обратите внимание, что вам нужно сделать отдельную (повторно) функцию инициализации, если вы хотите использовать ее более одного раза.

...