2012-07-19 93 views
1

我已經寫了一個TrieMap<V> implements Map<String,V>類,它顯然是從字符串鍵入的。這工作正常。爲沒有鍵的映射實現entrySet

我想加強它與更一般的CharSequence鍵。除了最後一個問題,我相信我已經實現了轉換,我無法創建K類型的對象。

現在簽名現在必須成爲TrieMap<K extends CharSequence,V> implements Map<K,V>。問題是,我相信你知道,TrieMap實際上並不存儲原始密鑰。 (實際上這是它的主要價值之一,因此它通常佔用的空間比普通地圖少得多。)

要實現Set<Entry<K, V>> entrySet()因此我必須以某種方式製造K類型的對象。有什麼方法可以實現嗎?

+0

@dfb:難點不是將鍵創建爲String實例。難點在於創建K型鍵,而不知道K是什麼。 – 2012-07-19 15:08:54

+0

側面問題:在TrieMap 實現Map '時,以下問題/答案的優點是什麼? – dfb 2012-07-19 19:48:30

+0

@dfb - 不確定你在問什麼,但工廠方法的好處在於創建者提供了創建密鑰的機制,因爲由於類型擦除,只有創建者知道正在使用哪種類型。我覺得現在有點像星際迷航中的VGer。 :) – OldCurmudgeon 2012-07-20 00:42:06

回答

3

我會定義以下接口:

public interface KeyBuilder<K extends CharSequence> { 
    public K build(CharSequence value); 
} 

,並提供接口給TrieMap構造方法的實現。當你需要建立一個新的K實例時,你可以讓接口去做。

您可能會使用更適合您的數據結構的內容作爲build方法的參數,CharSequence只是一種可能性。如果你想要做一些更復雜,你可以構建這樣的:

public interface KeyFactory<K extends CharSequence> { 
    public KeyBuilder<K> newBuilder(); 
} 

public interface KeySequence<K extends CharSequence> { 
    public KeySequence<K> append(char value); 
    public K build(); 
} 

隨着String實現:

public class StringKeyFactory<String> { 
    public KeyBuilder<String> newBuilder() { 
     return new KeyBuilder<String>() { 
      private final StringBuilder s = new StringBuilder(); 
      public KeySequence<String> append(char value) { 
       s.append(value); 
       return this; 
      } 
      public String build() { 
       return s.toString(); 
      } 
     }; 
    } 
} 
+0

這應該工作。你能想到我可以通過任何方式爲最常見的CharSequence實現者(如String和StringBuilder)預先構建工廠,並自動選擇合適的工具嗎?我想這可能是我的一個工廠,比如'newStringMap()'等。這是一種恥辱,我不能在構造函數中詢問泛型類型。 – OldCurmudgeon 2012-07-19 15:13:04

+0

我認爲靜態構造函數是最簡單和最乾淨的選擇。 – Flavio 2012-07-19 15:19:59

+0

我選擇了一個更簡單的接口,一個'K toK(CharSequence key)'方法,它可以從CharSequence中創建一個'K'。否則這是一個完美的解決方案。 – OldCurmudgeon 2012-07-20 00:51:13

0

不,我不明白怎麼會是可能的,而不採取Factory<K>作爲你的構造函數中的參數。根據您在TrieMap中的元素,此Factory<K>將負責創建K的實例。