我有一個帶有字符串作爲鍵的樹形圖。我想獲得所有鍵的字符串搜索開始的值。在TreeMap中獲取其字符串鍵以模式開頭的值
我想我需要在這裏做的是一樣的東西:
myTreeMap.subMap(search.concat(X1),真實,search.concat(X2),TRUE);
其中X1和X2是最高和最低可能的字符。
有沒有更好的方法?如果不是,X1和X2是什麼?
在此先感謝。
我有一個帶有字符串作爲鍵的樹形圖。我想獲得所有鍵的字符串搜索開始的值。在TreeMap中獲取其字符串鍵以模式開頭的值
我想我需要在這裏做的是一樣的東西:
myTreeMap.subMap(search.concat(X1),真實,search.concat(X2),TRUE);
其中X1和X2是最高和最低可能的字符。
有沒有更好的方法?如果不是,X1和X2是什麼?
在此先感謝。
基本上你需要按字典下一前綴作爲第二邊界:
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;
}
問題是你試圖做的部分關鍵搜索。
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也必須是相等的,這會打破我認爲的規則。
我認爲這是你唯一的選擇,其他然後搜索你想要的鍵列表。
那麼,有智能解決方案。查看其他答案 –
由於我的編輯以上被拒絕過於原來的答案,我會張貼在這裏。這個答案修復了拼寫錯誤,並處理了原來沒有的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;
}
因此,你想要的鍵開始與搜索值?所以如果搜索是「富」,你正在尋找「富*」正確? –
是的,正確:) – bluehallu