私は現在HashMap<String, Integer>
を使用していますが、これはString
型のキーで満たされています。これらはすべて、たとえば5文字の長さです。 4文字以下の特定のキーを検索するにはどうすればよいですか?これは一部であり、他のキーの先頭にあり、すべてのヒットを<Key, Value>
のコレクションとして取得できますか?
カスタムデータ構造を作成しない限り、反復が唯一のオプションです。
for (Entry<String, Integer> e : map.entrySet()) {
if (e.getKey().startsWith("xxxx")) {
//add to my result list
}
}
より時間効率の良いものが必要な場合は、これらの部分キーを追跡するマップの実装が必要になります。
HashMap
を介してこれを行うことはできません。マップ内で文字列の長さベースの検索を実装するには、Map
の独自の実装を記述する必要があります。
TreeMap
ではなくHashMap
のユースケースのようです。違いは、TreeMapが順序を保持することです。そのため、部分一致をより迅速に見つけることができます。マップ全体を確認する必要はありません。
この質問を確認してください HashMapでの部分検索
Map<String, Integer> result = new HashMap<String, Integer>;
for(String key : yourMap.keySet()) {
if(key.length() == 4){
result.put(key, yourMap.get(key);
}
}
このコードを実行すると、result
に4文字のキーを持つすべてのキー/値ペアができます。
Set<Entry<String, Integer>> s1 = map.entrySet();
for (Entry<String, Integer> entry : s1) {
if(entry.getKey().length == 4)
//add it to a map;
}
まず、ハッシュマップに設定されたエントリを取得します。セットを反復処理し、各キーの長さを確認してマップに追加するか、必要に応じて使用します。
_HashMap<String, Integer>
_を使用すると、String
キーとパターンに対してkeySet()
のみを実行し、contains()
を実行できます。
例えば:
public static void checkMap(Map mp) {
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
System.out.println(pairs.getKey().toLowerCase().contains("YourString"))
}
}
このコードは、keys
を含むsubstring
に対してtrueを出力します。
既に述べたように、指定したデータ構造を使用してそれを実行するための非常に効率的な*方法はありません。ただし、追加のMap<Integer, List<String>>
を使用して、文字列の長さからその長さを持つすべてのキーのリストへのマッピングを追跡すると、非常に効率的にこれを行うことができます。
* Map <String、Integer>のみを使用すると、より大きなマップの全容量を反復処理する必要がありますが、この補足データ構造を追加するとO(1)ルックアップ( HashMapを使用します)に続いて、結果セットのみを反復処理します。これは、可能な限り最速の結果です。
このアプローチを試すことができます:
public Map<String,Integer> filterMap(Map<String, Integer> inputMap){
Map<String, Integer> resultHashMap = new HashMap<String, Integer>();
for (String key : inputMap.keySet()) {
if(key.length()==5){
resultHashMap.put(key,inputMap.get(key));
}
}
return resultHashMap;
}