2016-10-22 46 views
3

我研究這個問題的代碼:的Java遞歸:如何通過一個String

給定一個字典,編寫一個函數來壓平。

考慮下面的輸入/輸出方案爲更好地理解:

Input: 

{ 
    'Key1': '1', 
    'Key2': { 
    'a' : '2', 
    'b' : '3', 
    'c' : { 
     'd' : '3', 
     'e' : '1' 
     } 
    } 
} 

Output: 
{ 
    'Key1': '1', 
    'Key2.a': '2', 
    'Key2.b' : '3', 
    'Key2.c.d' : '3', 
    'Key2.c.e' : '1' 
} 

接受的解決方案是低於(請注意,這僅僅是僞代碼)。

我要實現它在Java中

function flattenDictionary(String initialKey, dictionary, flatDictionary){ 

    for (key : dictionary.keyset()){ 
     value = dictionary.get(key) 

     if (!isHashMapInstance(value)){ 
      if (initialKey == null || initialKey == "") 
       flatDictionary.put(key, value) 
      else 
       flatDictionary.put(initialKey + "." + key, value)    
     } 
     else { 
     if (initialKey == null || initialKey == "") 
      flattenDictionary(key, value, flatDictionary) 
     else 
      //-----> Here we are creating a new String for each recursive call !!!!<---- 
      flattenDictionary(initialKey + "." + key, value, flatDictionary) 
     } 
    } 
} 

我懷疑是在箭頭。

我們遞歸地傳遞給flattenDictionary()方法一個新的字符串,每次連接initialKey和我們從Map獲得的新的。

在這裏,我們有可能造成很多長串!

是否有可能避免產生所有這些字符串?

我不認爲通過StringBuilder的可能是一個解決方案,因爲我們最終會得到錯誤的結果

+1

由於字符串是不可變的,你總是創建一個新的。 Stringbuilder tho使用內部的'char []'來存儲值 –

回答

1

您可以使用StringBuilder,如果你撤消您的遞歸調用後的變化。假設initialKey現在的StringBuilder一個實例,你可以做這樣的事情:

int originalLength = initialKey.length() 
initialKey.append(".").append(key) 

flattenDictionary(initialKey, value, flatDictionary) 

initialKey.setLength(originalLength) // undo: delete the appended chars