2017-09-06 4 views
1

エントリの値の属性に基づいてエントリのセットを削除するための、高速で信頼できる方法/アプローチがありますか。アプローチの下では、望ましくない項目をすべてループします。 例えば:ConcurrentHashMapの - エントリが追加のデータ構造を利用することなく、代わりにマップを変異のない良い方法はありません、何百万マップ内のエントリのセットを削除するための最善の方法

Iterator<Map.Entry<String, POJO>> iterator = map.entrySet().iterator(); 
    for (Iterator<Map.Entry<String, POJO>> it = iterator; it.hasNext();) { 
     Map.Entry<String, POJO> entry = it.next(); 
     POJO value = entry.getValue(); 
     if (value != null && *attribute*.equalsIgnoreCase(value.getAttribute())) { 
      it.remove(); 
     } 
    } 
+0

によってあなたのための別のです。したがって、特定の属性を持つPOJO識別子を追跡するための別のデータ構造を持つことができます。または、属性別にデータを分割する異なるマップを持つことができます。しかし、これを簡単にすることは複雑になります。アプリケーションでボトルネックと判断しましたか? –

答えて

0

になります。あなたが基本的に求めているのは、いくつかの非主キーのプロパティに基づいてエントリへのポインタを持つ、データベースで採用されているようなセカンダリインデックスです。余分なインデックスを保存したくない場合は、すべてのエントリを繰り返し処理するのが簡単ではありません。

私が調べることをお勧めするのは、元の地図上にマップビューを作成することです。例えば、あなたは(例えば、その上)(サイズを呼び出すことはありません)このようなビューに注意する必要があります何か

Map<String,POJO> smallerMap = Maps.filterValues(map, 
    v -> !attribute.equalsIgnoreCase(v.getAttribute()) 
); 

(グアバを使用)のような、しかし、アクセスなどのために、それはあなたに応じて、(問題ないはずです正確なニーズ、記憶の制約など)。

サイドノート - ご注意ください。値のヌルチェックを削除しました。 ConcurrentHashMapにヌル値を格納することはできません。また、ノーマルマップでもそうではありません。キー全体を削除する方がよいでしょう。

+1

お寄せいただきありがとうございます!マップに保持されているデータは、別のプロセスのソースデータとして使用されます。したがって、データは削除する必要があります。複数の追加、削除、更新要求がマップ上のデータに対して存在します。あなたが提案しているビューは、このシナリオには役立ちません。 – user3629658

0

私は

まず解決策を考えることができる2つのソリューションがあります値としてキーと対応するキーとしてオブジェクトのハッシュコードを格納するための別のマップを作成し

が。構造は以下のようになります。

Map<Integer, String> map2 = new HashMap<>(); 

ここでは解決策があります。オブジェクトの数が多い場合は、一意のハッシュコードを取得するのが難しいかもしれません。

import java.util.HashMap; 
import java.util.Map; 

public class DualHashMap { 

    public static void main(String a[]){ 

     Map<String, Pojo> map = new HashMap<>(); 
     Map<Integer, String> map2 = new HashMap<>(); 

     Pojo object1 = new Pojo(); 
     Pojo object2 = new Pojo(); 
     map.put("key1", object1); 
     map.put("key2", object2); 

     map2.put(object1.hashCode(), "key1"); 
     map2.put(object2.hashCode(), "key2"); 

     // Now let say you have to delete object1 you can do as follow 
     map.remove(map2.get(object1.hashCode())); 
    } 
} 


class Pojo{ 

    @Override 
    public int hashCode(){ 
     return super.hashCode(); //You must work on this yourself, and make sure hashcode is unique for each object 
    } 

} 

第二ソリューション: -

必要なのApache CommonsのクラスがBidiMapあるグアバやApache

によるデュアルハッシュマップのために提供される解決策を使用してください。ここで

は、データベースが_indexes_を使用することによって、物事のこれらの種類を処理Guava

+0

1)なぜここにハッシュコードを含めるのですか? OPは、ハッシュコードではなく、索引付けされたgetAttributeを持つことを望んでいます。 2)属性がユニークであることを望むことはできません。双方向マップではなく、マルチマップのようなものを使用する必要があります。 3) 'return this.hashCode()'を実行して何を表示したいか分かりませんが、与えられたように無限ループに入ります。たぶんあなたはparent.hashCode()ですか? (とにかく多くの意味があるわけではない) –

+0

私は言った - hascodeは道の一つかもしれない。私はOPがhashcodeを他の場所で使用していないと確信しています。ハッシュコードメソッドの実装のコメントを参照してください。私はコメントについて明確に書いています。ユーザーがPOJOのIDを保持している場合は、hashCodeメソッドの戻り値の最良の選択です。 – nagendra547

関連する問題