2011-03-06 99 views
0

我正在創建這個類,它是一個基於哈希映射的自定義Map。我有一個add方法,如果添加一個對象,則該對象將成爲關鍵字,如果該對象當前不在列表中,則其值將爲1。但是,如果添加當前在列表中的對象,它的值將會增加1.因此,如果我添加了10個完全相同的字符串,那麼鍵將是該字符串,並且值將是10.我在實踐中理解我遍歷地圖,實際上只有一個對象要迭代,但是,我正在嘗試創建一個內部類,它將定義一個迭代器,該迭代器會迭代同一個對象,但其值多次。我可以通過簡單地使用for循環來構造一個適當的ArrayList,併爲此創建一個迭代器,但效率太低。有沒有一個簡單或更有效的方法來做到這一點?構建一個自定義迭代器

回答

1

你可以用兩個變量做到這一點:

private T nextObj = null; 
private int times = 0; 

T next(){ 
    if(times==0){ 
     // get the next object and set the times variable to it's value in the hashmap 
    } 
    times--; 
    return nextObj; 
} 
+0

我看不到你用nextObj做了什麼。你能解釋一下這個變量嗎? – Isai 2011-03-06 23:17:15

+0

它只是對迭代器要返回的下一個對象的引用。所以不要說「返回某些東西」,而是說「nextObj = something」。如果你還沒有構建你自己的迭代器,你可以定義一個迭代器,然後使用Map的Iterator的next()來填充nextObj。 – dtech 2011-03-06 23:21:22

0

你可以使用nCopies從集合API。這將創建一個只有一個參考的列表,因此它會很有效率。然後,只需返回List的迭代器即可。無需創建一個內部類。

假設你Map<String, Integer>實例變量被稱爲地圖,你可以做到以下幾點:

Iterator<String> customIteratorForKey(String key) { 
    return Collections.nCopies(map.get(key), key).iterator(); 
} 
+0

我實際上必須使用擴展Iterator的內部類,因爲這是一個學校項目:/ – Isai 2011-03-06 23:20:56

0

這聽起來像你正在實施一個multiset or bag:一組計算每一個獨特的元素。由於這是一個學校項目,我將介紹如何去做而不是提供代碼。試試你的運氣,如果你遇到問題,可以改進你的問題。

當我創建一個使用另一個集合的新集合類型時,我通常在構建迭代器時做同樣的事情。

  1. Bag.Iterator的構造將與來自Map迭代器初始化。
  2. 正如dtech上面所示,迭代器需要跟蹤它正在計數的當前對象以及它應該返回它的次數。
  3. next()需要在開始時獲取下一個對象,並且一旦當前對象用完了計數。
  4. hasNext()必須做同樣的事情,而不實際減少計數或抓住下一個對象。
0

我終於明白了。這是我的解決方案。感謝所有迴應並給我指點的人。

private int times = 0; 
    private boolean flag = true; 

    Iterator<Entry<T, Integer>> it = Bag.entrySet().iterator(); 
    private Entry<T, Integer> t = it.next(); 
    private int value = t.getValue(); 
    private T nextObj = t.getKey(); 

    public boolean hasNext() { 
     if (times > 0) { 
      return true; 
     } 
     return it.hasNext(); 
    } 


    public T next() { 
     if (this.hasNext() == false) { 
      throw new NoSuchElementException(); 
     } 
     if (times == 0 && flag == true) { 
      times = value; 
      flag = false; 
     } 
     if (times == 0 && flag == false) { 
      t = it.next(); 
      value = t.getValue(); 
      nextObj = t.getKey(); 
      times = value; 
     } 
     times--; 
     return nextObj; 
    }