2016-11-16 12 views
1

私はバッファクラス(BufferCharacter)からLinkedListを取得しようとしていて、ReaderクラスのLinkedListのすべての要素をループしています。しかし、私がをBufferCharacterクラスのget()メソッドで返すようにしようとすると、それをReaderクラスでループすることはできません。私はBufferクラスのリストをループして、そこから各要素を返そうとしましたが、どちらも機能しません。Linked Link経由でループする

ご協力いただきありがとうございます。

public class CharacterBuffer { 

    private char ch; 
    private LinkedList buffer = new LinkedList(); 
    private boolean filled; 

    public void put(char ch) { 
     buffer.addLast(ch); 
    } 

    public void filled() { 
     filled = true; 
    } 

    public Object get() throws InterruptedException { 
     while (buffer.isEmpty()) { 
      // wait(); 
      return "Waiting"; 
     } 
     return buffer; 
    } 

    public synchronized void putSync(char ch) { 
     buffer.addLast(ch); 
    } 

    public synchronized Object getSync() throws InterruptedException { 
     while (buffer.isEmpty()) { 
      // wait(); 
      return "---------"; 
     } 

     for(int i = 0; i<buffer.size(); i++){ 
      System.out.println(buffer.get(i)); 
     } 

     return buffer; 

    } 

    public int size(){ 
     return buffer.size(); 
    } 

} 

public class Reader extends Thread { 

    private GUIMutex gui; 
    private CharacterBuffer buffer; 
    private boolean isSynced; 

    public Reader(GUIMutex gui, CharacterBuffer buffer, boolean isSynced) { 
     this.gui = gui; 
     this.buffer = buffer; 
     this.isSynced = isSynced; 
    } 

    public void run() { 
     String data = "test"; 
     while (true) { 

      try { 
       // data = buffer.get(); 
       if (isSynced) { 
        gui.setReaderText(buffer.getSync() + "\n"); 
       } else { 
        for(int i = 0; i<buffer.get().size(); i++){ 
         gui.setReaderText(i); 
        } 
        gui.setReaderText(buffer.get() + "\n"); 
       } 
       Thread.sleep(700); 
      } catch (InterruptedException e) { 
      } 

     } 
    } 
} 
+0

あなたは、Javaのforループの最適化で見たことがありますか?例えば。 for(オブジェクトo:バッファ){...}。またはリスト反復子ですか? – TungstenX

+0

コードにはさらに問題があります。 get()メソッドとgetSync()メソッドは、バッファが空でない場合(「Waiting」を返してメソッドを終了するまで)「待機」しません。あなたのLinkedListをタイプするほうがいいです。リストバッファ=新しいLinkedList <>(); – TungstenX

+0

'List'に格納する' Character'の 'char'を全てラップするのはひどい考えです。余分なメモリ割り当てとガベージコレクションは、リソースの愚かな使用になります。 'StringBuilder'を使わないのはなぜですか? –

答えて

1

あなたはあなたが何を話しているのか理解していないと思います。そこでここでいくつかの光を当てようとします。

最後に、あなたは複数の要素を含む何らかの "コレクション"クラスについて話しています。あなたのケースではLinkedList。そのようなクラスを使用するには、提供するAPIを明確に理解する必要があります。

バッファを使用して、個別のchar値を格納することを考えました。これは、putSync()を使用して追加します。

しかし···正確にはgetSync()さんとなっていますか?

あなたの場合、単にバッファを返すだけです。おそらくが間違っているです。理解する

synchronized boolean hasNext() 

synchronized char getNext() 

最初のメソッドを呼び出すことができ、あなたのクラスのユーザー:

は代わりに、次のようなメソッドを持ってしたい他の文字があります。もしそうであれば、2番目のメソッドはそれらの値を返します。

これは、コードを改善するための最初の簡単な方法です。より妥当な方法は、getIterator()メソッドを実装して、Iteratorインターフェイスを実装するオブジェクトを返すことです。

その他の注意事項:「内蔵」の場合LinkedList;このクラスがジェネリックをサポートしていることをご理解ください!

したがって、あなたは次のようにそれを使用する必要があります。厳密に型指定されたコレクションを使用してからのすべての利点を得るために

private final List<Character> buffer = new LinkedList<>(); 

編集:お客様のご意見に、私はを使用していると思います。リンクされたリストはここでは間違ったアプローチです。

代わりにリストを使用しての、あなたがQueueを使用したい、のような:クラスはあなたの一方の当事者がキューテールで要素を追加することができる機能を提供します

private final Queue<Character> buffer = new ConcurrentLinkedQueue<>(); 

。もう1つのパーティーは、キューヘッドから要素を削除します。

追加ボーナス:そのクラスは既にあなたのために同期作業を行っているので、気にする必要はありません!

+0

どうすればこれらの値を正確に返すことができますか?コード例はわかりやすいでしょう。また、私はあなたの助けに非常に感謝します! getSyncは値が返されるだけです。リストが空の場合は「待機中」が返されます。私はこのプログラムに2つのスレッドを持っています.1つは文字をリストに書き込むスレッド、もう1つはスレッドを読み取るスレッドです – Amar

+0

これは事実です。戻りたいものはどこにも説明していません。そのバッファのすべての内容を単一の文字列として返すつもりですか?そしてヒント:「待っている」という文字列を返すことは非常に悪い考えです。 – GhostCat

+0

私は各要素(この場合は各文字)を返すことはできません。これらの文字をスレッドで使用して、それらをtextAreaで印刷しています。 https://gyazo.com/6232569cabd31f2fa5a85506e1224d5aは、どのように実行する必要があるかの例のスクリーンショットです。 – Amar

0

使用StringBuilderの代わりに

StringBuilder sb = new StringBuilder(128); 
    // add chars using sb.append(char) 
    for (int i = 0, n = sb.length(); i < n; i++) 
    { 
    char c = sb.charAt(i); 
    } 

    or 

    String s = sb.toString(); 
関連する問題