2016-11-16 196 views
1

我試圖從我的緩衝區類(BufferCharacter)中獲得LinkedList,然後循環遍歷Reader類中的LinkedList中的每個元素。但是,當我嘗試返回LinkedList中的get()方法BufferCharacter類I則無法在Reader類中循環。我試圖循環遍歷Buffer類中的列表,然後從那裏返回每個元素,但那也不起作用。循環遍歷LinkedList

任何幫助,高度讚賞!

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(Object o:buffer){...}。或者列表迭代器? – TungstenX

+0

您的代碼存在更多問題。 get()和getSync()方法在緩衝區不爲空之前不會「等待」(它將返回「Waiting」並退出方法)。最好輸入你的LinkedList,例如列表 buffer = new LinkedList <>(); – TungstenX

+0

將'Character'中的每個'char'包裝到'List'中是一個糟糕的主意。額外的內存分配和垃圾收集將是對資源的一種愚蠢使用。爲什麼不使用'StringBuilder'? –

回答

1

我覺得你不明白你在說什麼;所以我們試着在這裏說明一些事情。最後,你說的是某種「集合」類,它包含多個元素;在你的情況下一個LinkedList。問題是:爲了使用這樣的類,你需要清楚地理解你打算提供的API。

您認爲您要使用該緩衝區來存儲您使用putSync()添加的各個char值。

但是......然後...... getSync()應該做什麼?

在你的情況下,你只是簡單地返回緩衝區,那可能是錯誤

相反,你想有這樣的方法:

synchronized boolean hasNext() 

synchronized char getNext() 

你的類可以調用第一種方法的用戶推測:有沒有其他的字符;如果是這樣,第二個方法返回這些值。

這將是第一個簡單的方法來改善您的代碼。更合理的方法是實現一個方法getIterator(),該方法將返回一個實現接口的對象。

其他注意事項:如果您使用的是「內置」LinkedList;請理解這個類支持泛型!

因此,你應該使用它喜歡:

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

獲得使用強類型集合所有優點!

編輯:在您的意見,我認爲使用LinkedList是簡單的錯誤的方法在這裏。

而不是使用一個列表,你想用一個Queue,如:

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

那類爲您提供了功能,一方可以在隊列尾部添加元素;而另一方從隊列頭中刪除元素。

額外的好處:這個班級已經在爲你做同步工作,所以你不需要關心這個!

+0

我會如何返回這些值?代碼示例很容易理解。我也非常感謝你的幫助! getSync應該返回值,如果列表爲空,它只是返回「等待」。我在這個程序中有兩個線程,一個寫入字符到列表中,另一個讀取它們。 – 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();