2016-03-28 22 views
0

Iは、(いくつかのサンプルデータを有する)は、以下のコードを持って、そして次の1にマップのリストの各要素を比較するための任意のより良いまたはパフォーマンスの方法が存在するかどうかを確認したい:リストの要素とJavaのマップの要素を比較するにはどうすればよいですか?

import java.util.*; 

public class CompareElements { 

private static List<Map<String, String>> sample = new ArrayList<>(0); 
private static int MIN = 0; 
private static int MAX = 10; 

static { 
    populateListOfMaps(); 
} 

/* 
* This is the main part of the question, rest is just to generate test data.. 
*/ 
public static void main(String[] args){ 
    // Can we simplify this part using lambda's or any library? 
    for (int i = 0; i < sample.size() -1; i++) { 
     for (int j = i+1; j < sample.size(); j++) { 
      Map<String, String> referenceMap = sample.get(i); 
      Map<String, String> candideMap = sample.get(j); 
      if(referenceMap.get("key").equalsIgnoreCase(candideMap.get("key"))){ 
       System.out.println("Equal : " + i + " || " + referenceMap.get("key") + " and "+ j + " || " + candideMap.get("key") + " are pairs"); 
      } else { 
       System.out.println("Not equal : " + i + " || " + referenceMap.get("key") + " and "+ j + " || " + candideMap.get("key") + " are pairs"); 
      } 
     } 
    } 
} 

private static void populateListOfMaps(){ 
    if(sample.size() <= 10){ 
     Map<String, String> someMap = new HashMap<>(0); 
     someMap.put("key", "value" + randInt(MIN, MAX)); 
     sample.add(someMap); 
     populateListOfMaps(); 
    } 
} 

public static int randInt(int min, int max) { 
    Random rand = new Random(); 
    int randomNum = rand.nextInt((max - min) + 1) + min; 
    return randomNum; 
} 

}

私の要件は地図のリストの各要素を比較し、重複を取り除くために等価性をチェックすることです。これは簡単な部分ですが、リアルタイムアプリケーションの各マップは2つのキー値を持ちますカスタムPOJOオブジェクト)。

上記のコードは機能しますが、私はこれをより簡潔で実用的なコードにしたいと考えています。

ラムダまたはストリームを使用できますか?

+0

すべてのポインタ。 。手段? –

+0

「リアルタイム」は、一貫したレイテンシを持っています。 「現実の世界」とは、現実世界では、すなわち。理論的ではない。 –

+2

"上記のコードは機能しますが、これをより簡潔で実用的なコードにしたいと思います。 - あなたの質問は、StackOverflowのトピックから外れているのでhttp://codereview.stackexchange.com/に投稿するべきだと思います。 –

答えて

0

MongoDBからデータを取得しているので、あなたはスキーマを制御できないと思うので、POJOの使用は簡単なオプションではありません。 (それが生成されたコードで行うことができますが、あなたはおそらくそこに行くにしたくない)

O(n)

public static void main(String... args) { 
    List<Map<String, String>> sample = populateListOfMaps(); 
    sample.stream() 
      .collect(Collectors.groupingBy(m -> m.get("key"))) 
      .forEach((key, list) -> System.out.println(key + " : " + list)); 
} 

private static List<Map<String, String>> populateListOfMaps() { 
    Random rand = new Random(); 
    return IntStream.range(0, 10) 
      .mapToObj(i -> { 
       Map<String, String> someMap = new HashMap<>(2); 
       someMap.put("key", "value-" + rand.nextInt(10)); 
       return someMap; 
      }) 
      .collect(Collectors.toList()); 
} 

にこのO(n^2)ループを変更するgroupingByを使用しているあなたはどうすることができます。これはすべて印刷しますO(n)時間複雑度で同じ "キー"値を持つエントリ。例えば

value-9 : [{key=value-9}] 
value-8 : [{key=value-8}, {key=value-8}, {key=value-8}] 
value-5 : [{key=value-5}] 
value-7 : [{key=value-7}, {key=value-7}] 
value-1 : [{key=value-1}] 
value-0 : [{key=value-0}] 
value-2 : [{key=value-2}] 
0

私はあなたの正確な要件はそう一度あなたの質問1つの部分に取り組むことが何であるか本当にわからない:の各要素を比較するために任意のより良いか、パフォーマンスの方法があるかどうか

チェック次のマップへのマップのリスト:

keySetsの使用はどうですか?

Set<String> s1 = new HashSet<String>(referenceMap.values()); 
Set<String> s2 = new HashSet<String>(candideMap.values()); 

// Get intersection of values 
s1.retainAll(s2); 

// You can also get corresponding keys for each value later 

これが私のリアルタイム・アプリケーションの各マップには2つのキー値を持っている(しかし、両方とも文字列が...何のカスタムPOJOオブジェクトではない)O(n^2)からO(n)

にあなたの複雑さを減らす必要があります。

リアルタイムで何を意味するのかよく分かりません。地図はリアルタイムで変化していますか?あなたのソリューションと私のどちらもスレッドセーフではありません。

各エントリに2つのキー値がありますか?各キーに2つの値がある場合は、hashcode()equals()を上書きして、コードが機能するはずです。

あなたの質問に間違いがあった場合は教えてください

関連する問題