2011-10-17 5 views
0

クラスに値を返すようにしたいが、ループのようにその値を変更したい。私のコードは私ができるよりも良く説明すると思います。ループが返されていないので、最後のものだけを返すが、ループ内の唯一の最後のメッセージます残念ながらJavaがループを返す

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

、どのように私はそれが別々のリターンとしてループ内のすべての値を返すことができますか? (他のクラスに影響を与えずにここから可能な場合)

+1

私はこのメソッドを呼び出したメソッドからループで呼び出さなければならないと信じています。他のオプションは、区切り文字を使用して文字列を連結し、文字列全体を返すことです。 – Sid

答えて

4

できません。 Javaメソッドは1つの値しか返しません。何回も返すことはできません。 return文の後、あなたはそのメソッドから抜け出しています!

すべてのメッセージを格納してからリストを返すために、コレクション(たとえばListなど)を使用できます。

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

コレクションに関する追加情報については、こちらをチェック。あなたがJavaに慣れておらず、それを固執する計画をしているなら、それをマスターするのはかなり重要なことです。あなたは何をすべき

は、インスタンスの新しいコレクション、インスタンス化している:

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

をして、あなたのループ内で、あなたは...

messageList.add(msg); 

グランフィナーレのためにやります、もちろん...

return messageList; 

「外部」メソッド(呼び出し元)では、リストを介在させて、私を使用することができますあなたのニーズに合ったものをお選びください。

1

メソッドを呼び出すたびに異なるメソッドを返すようにするには、メソッドの状態を格納する必要があります - 特に不幸ですそれは静的な方法であるからです。

Iterable<String>を返すことがより適切なように私には感じます。あなたが反復できる1つのオブジェクト。拡張されたforループを使用します。

これを行う簡単な方法の1つは、ファイル全体を読み取ってList<String>にロードしてから返すことです。

グアバでこれを行うための別の方法は、例えば、あります(... FormatS.FormatS方法によって、かなり奇妙なメソッド名である)

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

は:Guavaは、これを行うのは非常に簡単な方法を提供しますLineProcessorを渡していますが、比較的新しいJavaの方が簡単な出発点です。

2

アレイを作成し、各値を配列内の別個の項目として配置し、配列を返します。または、ループ内のmsgに新しい値を追加します。

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

ループの外側でmsgを開始します。

0

これ以上のラインならば(それはあなたが必要なものの場合)すべての呼び出しは次の行を返す、または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; 
    } 
} 

注意それを複数回使用してください。

0

呼び出し元のメソッドからこのメソッドを繰り返し呼び出す必要があります。より良い方法は、内容をString配列に格納し、このメソッドを複数回呼び出すことなく配列を返すことです。

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

メソッドに複数の戻り値を呼び出し側に通知する2つのきれいな方法があります。

最初の最も簡単な方法は、すべての戻り値を含むオブジェクトを返すことです。それはリストのようなコレクションかもしれませんし、独自の価値クラスのオブジェクトかもしれません。

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

秒、より複雑な方法は、あなたの方法は、それが彼らに遭遇するようにアイテムを渡すことができハンドラを定義することです。呼び出し側はその後、自分たちのニーズを満たしているよりも、PersonH​​andlerを定義することができます

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

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

は、その後、あなたはそのハンドラがそれに渡されるあなたの方法を定義

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

これは終了しましたeは関与し、初心者は複雑です。しかし、それは心に留めておく価値があります。これは、膨大な数の応答を生成するメソッドを処理でき、メソッドが終了するまで待つことなく、メモリ内の巨大なListで終わることなく処理できることを意味します。また、無期限に実行できるメソッドからの出力に対処できることも意味します。

関連する問題