2010-07-23 49 views
1

打印值基於指數

NavigableMap<Integer,String> nmap = 
     new TreeMap<Integer,String>(); 

    nmap.put(3, "Three"); 
    nmap.put(1, "One"); 
    nmap.put(4, "Four"); 
    nmap.put(5, "Five"); 
    nmap.put(7, "Seven"); 
    nmap.put(10, "Ten"); 


System.out.println(nmap); 
// {1=One, 3=Three, 4=Four, 5=Five, 7=Seven, 10=Ten} 

有沒有一種機制,可以讓我通過索引值打印此,印刷,如果指數是從較小超過1以下索引打印 - (破折號):

一, - ,三,四,五, - ,六,七, - , - ,十

如何將我寫的功能呢?

我不必打印整張地圖的字符串我的意思是每個鍵/值對

+0

你真的想把它變成一個字符串嗎?或者你想要一個數組:「{」One「,null,」Three「,」Four「,」Five「,null,null,」Seven「}'? – Eric 2010-07-23 12:35:38

回答

1

這裏是一個廣義的解決方案,這也確實串聯。我的泛型knownledge是有些冒險,所以不要奇怪的錯誤感到驚訝:

static <V> List<V> NMapToList(NavigableMap<Integer,V> nmap, V emptyEntryValue) 
{ 
    Integer next = null; 
    List<V> list = new ArrayList<V>(); 

    for(NavigableMap.Entry<Integer, V> e : nmap.entrySet()) 
    { 
     Integer current = e.getKey(); 

     if(next != null) 
      for(int i = next; i < current; i++) 
       list.add(emptyEntryValue); 
     list.add(e.getValue()); 

     next = current + 1; 
    } 

    return list; 
} 

static String listToString(List<?> l, String separator) 
{ 
    StringBuilder sb = new StringBuilder("("); 
    String sep = ""; 
    for (Object object : l) 
    { 
     sb.append(sep).append(object.toString()); 
     sep = separator; 
    } 
    return sb.append(")").toString(); 
} 

String s = listToString(NMapToList(nmap,'-'),','); 
+0

你在正確的軌道,但我得到這個輸出[一,四,五,] – 2010-07-23 12:44:54

+0

你在這有些編譯錯誤是固定的http://pastebin.ca/1906815 – 2010-07-23 12:47:28

+0

我沒有看到區別。我做了另一次改變。我忘了提供參數 – Eric 2010-07-23 12:51:57

0

你必須創建樹形圖一個新的子類,並重寫toString方法。

+0

我不必打印整張地圖的字符串我意味着earh鍵/值對 – 2010-07-23 12:18:41

1

未經檢驗的,但應該工作:

public String myToString(final NavigableMap<Integer, String> nmap) { 
    StringBuilder sb = new StringBuilder(); 
    Integer lastKey = null; 
    for (Map.Entry<Integer, String> entry : nmap.entrySet()) { 
     Integer key = entry.getKey(); 
     if (lastKey != null) { 
      for (int i=(lastKey+1); i<key; i++) { 
       sb.append(",-"); 
      } 
     } 
     if (sb.length() != 0) { 
      sb.append(","); 
     } 
     sb.append(entry.getValue()); 
     lastKey = key; 
    } 
    return sb.toString(); 
} 
+0

我修正了這段代碼編譯的問題,這裏是http://pastebin.ca/1906823,但是它產生這個輸出,一,三,四,五,七我不知道如何修復它 – 2010-07-23 12:51:50

+0

@Gandalf:那是因爲你的修復是錯誤的。 '.equals(null)'不會產生任何有用的東西。我從來不想在'Map'上調用'.lastKey()'。我已經修復了代碼。它爲我編譯並生成正確的輸出。 – 2010-07-23 13:00:25

+0

如果只有一個映射關鍵字丟失,即「一,三,四,五, - ,六」,但是如果案例不止一個,則缺失即「一,三,四,五, - ,六, - , - ,Nine'我更新了我的問題 – 2010-07-29 22:17:39

0

您應該使用NavigableMap的,它返回的NavigableSet<K> navigableKeySet()方法包含在此映射中的鍵的NavigableSet視圖。集合的迭代器按照升序返回鍵。然後迭代Set並從NavigableMap中獲取值。

編輯: 要使用此System.out.println(nmap);您應該從NavigableMap繼承子類,並使用我之前編寫的步驟重寫toString()方法。

+0

不,它; S更好地遍歷的entrySet'()'鍵:'爲(NavigableMap.Entry E:nmap.entrySet())' – Eric 2010-07-23 13:47:52

+0

是的,你是對的。這樣更有效率。感謝名單! – 2010-07-23 13:55:50