web-dev-qa-db-ja.com

HashMap <String、Integer>キーの一部を検索しますか?

私は現在HashMap<String, Integer>を使用していますが、これはString型のキーで満たされています。これらはすべて、たとえば5文字の長さです。 4文字以下の特定のキーを検索するにはどうすればよいですか?これは一部であり、他のキーの先頭にあり、すべてのヒットを<Key, Value>のコレクションとして取得できますか?

16
Machtl

カスタムデータ構造を作成しない限り、反復が唯一のオプションです。

for (Entry<String, Integer> e : map.entrySet()) {
    if (e.getKey().startsWith("xxxx")) {
        //add to my result list
    }
}

より時間効率の良いものが必要な場合は、これらの部分キーを追跡するマップの実装が必要になります。

23
cyborg

HashMapを介してこれを行うことはできません。マップ内で文字列の長さベースの検索を実装するには、Mapの独自の実装を記述する必要があります。

4
harsh

TreeMapではなくHashMapのユースケースのようです。違いは、TreeMapが順序を保持することです。そのため、部分一致をより迅速に見つけることができます。マップ全体を確認する必要はありません。

この質問を確認してください HashMapでの部分検索

4
Ondrej Bozek
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文字のキーを持つすべてのキー/値ペアができます。

3
André Stannek
Set<Entry<String, Integer>> s1 = map.entrySet();
    for (Entry<String, Integer> entry : s1) {
          if(entry.getKey().length == 4)
          //add it to a map;
}

まず、ハッシュマップに設定されたエントリを取得します。セットを反復処理し、各キーの長さを確認してマップに追加するか、必要に応じて使用します。

1
Adarsh

_HashMap<String, Integer>_を使用すると、Stringキーとパターンに対してkeySet()のみを実行し、contains()を実行できます。

0
pbespechnyi

例えば:

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を出力します。

0
aran

既に述べたように、指定したデータ構造を使用してそれを実行するための非常に効率的な*方法はありません。ただし、追加の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;
    }
0
Shreyos Adikari