Yeah, a HashMap is not the right data structure for this. As Bozho said, a Trie would be the right one.
With Java's on-board tools, a TreeMap (or any SortedMap, actually) could be used:
public <V> SortedMap<String, V> filterPrefix(SortedMap<String,V> baseMap, String prefix) {
if(prefix.length() > 0) {
char nextLetter = prefix.charAt(prefix.length() -1) + 1;
String end = prefix.substring(0, prefix.length()-1) + nextLetter;
return baseMap.subMap(prefix, end);
}
return baseMap;
}
The output would even be sorted by key.
Here an usage example:
SortedMap<String, String> nameNum = new TreeMap<String, String>();
// put your phone numbers
String prefix = ...;
for(Map.Entry<String,String> entry : filterPrefix(nameNum, prefix).entrySet()) {
System.out.println(entry);
}
If you want your prefix filter to not be depending on case differences, use a suitable Comparator for your map (like a Collator
with a suitable strength setting, or String.CASE_INSENSITIVE_ORDER
).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…