2012-05-22 37 views
1

我有一個帶有字符串作爲鍵的樹形圖。我想獲得所有鍵的字符串搜索開始的值。在TreeMap中獲取其字符串鍵以模式開頭的值

我想我需要在這裏做的是一樣的東西:

myTreeMap.subMap(search.concat(X1),真實,search.concat(X2),TRUE);

其中X1和X2是最高和最低可能的字符。

有沒有更好的方法?如果不是,X1和X2是什麼?

在此先感謝。

+2

因此,你想要的鍵開始與搜索值?所以如果搜索是「富」,你正在尋找「富*」正確? –

+0

是的,正確:) – bluehallu

回答

0

基本上你需要按字典下一前綴作爲第二邊界:

public <T> Map<String, T> subMapWithKeysThatAreSuffixes(String prefix, NavigableMap<String, T> map) { 
    if ("".equals(prefix)) return map; 
    String lastKey = createLexicographicallyNextStringOfTheSameLenght(prefix); 
    return map.subMap(prefix, true, lastKey, false); 
} 

String createLexicographicallyNextStringOfTheSameLenght(String input) { 
    final int lastCharPosition = input.length()-1; 
    String inputWithoutLastChar = input.substring(0, lastCharPosition); 
    char lastChar = input.charAt(lastCharPosition) ; 
    char incrementedLastChar = (char) (lastChar + 1); 
    return inputWithoutLastChar+incrementedLastChar; 
} 
0

嗯。我會說你應該做myTreeMap.subMap(search, true, search2, false)其中search2不連接,而是「遞增」。畢竟,如果X2只是一個字符,那麼你的實現將會錯過search.concat(X2).concat(X2)

+0

遞增字符串?我在你的回答中丟失了我的東西 – bluehallu

+0

增加'String'中的最後一個字符。例如,給定「abc」,對「search2」使用「abd」。 –

+0

是的,但你怎麼做?如果有數字呢? – bluehallu

0

問題是你試圖做的部分關鍵搜索。

myTreeMap.subMap(search.concat(X1), true, search.concat(X2), true); 

讓我們假設你有一些鍵/值對:

foobar的 - >有些值 fooBage - >其他一些價值 barBear - >運行出來的價值觀念 酒保 - >另一值爲

現在你想找到所有「foo *」,在這個例子中是fooBar和fooBage。該鍵被視爲單個標記,在這種情況下恰好是一個字符串。沒有辦法將密鑰視爲部分密鑰。即使說你想「fooA」通過「fooZ」不會讓你fooBar,或fooBage。如果你使關鍵類(我稱之爲FractionalKey),並重寫equals方法,那麼你可以定義爲「一些正則表達式」,或「整個事情,或只是第一部分」等。這個問題是,如果equals返回true,那麼hashcodes也必須是相等的,這會打破我認爲的規則。

我認爲這是你唯一的選擇,其他然後搜索你想要的鍵列表。

+0

那麼,有智能解決方案。查看其他答案 –

0

由於我的編輯以上被拒絕過於原來的答案,我會張貼在這裏。這個答案修復了拼寫錯誤,並處理了原來沒有的int溢出。

public <T> Map<String, T> subMapWithKeysThatAreSuffixes(String prefix, NavigableMap<String, T> map) { 
    if ("".equals(prefix)) return map; 
    String lastKey = createLexicographicallyNextStringOfTheSameLength(prefix); 
    return map.subMap(prefix, true, lastKey, false); 
} 

String createLexicographicallyNextStringOfTheSameLength(String input) { 
    final int lastCharPosition = input.length()-1; 
    String inputWithoutLastChar = input.substring(0, lastCharPosition); 
    char lastChar = input.charAt(lastCharPosition); 
    char incrementedLastChar = (char) (lastChar + 1); 
    // Handle int/char overflow. This wasn't done above. 
    if (incrementedLastChar == ((char) 0)) return input+incrementedLastChar; 
    return inputWithoutLastChar+incrementedLastChar; 
} 
相關問題