2017-11-15 18 views
2

2つのハッシュマップをキーで並べ替え、それらの値を比較して同じ値を持たないすべてのキーを出力したいと思います。これを行う方法を教えてください。以下は私のコードです。私はJavaに慣れておらず、データ構造を一つ一つ学習しています。助けてくれてありがとう。キーで2つのハッシュマップを比較し、同じ周波数を持たないキーを返す

コード: -

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class Solution { 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     int val; 

     int n = scan.nextInt(); 
     HashMap<Integer,Integer> h1 = new HashMap<Integer,Integer>(); 

     for(int i=0;i<n;i++) {   
      val = scan.nextInt(); 
      if(!h1.containsKey(val)) { 
       h1.put(val,1); 
      } 
      else { 
       h1.put(val,h1.get(val)+1); 
      } 
     } 

     int m = scan.nextInt(); 

     HashMap<Integer,Integer> h2 = new HashMap<Integer,Integer>(); 

     for(int i=0;i<m;i++) {   
      val = scan.nextInt(); 
      if(!h2.containsKey(val)) { 
       h2.put(val,1); 
      } 
      else { 
       h2.put(val,h2.get(val)+1); 
      } 
     } 

     System.out.println(h1.keySet()); 
     System.out.println(h1.values()); 
     System.out.println(h2.keySet()); 
     System.out.println(h2.values()); 

     }   
} 
+0

ソートとは何が関係していますか? – shmosel

+0

Guavaの 'Maps.difference()'は、あなたが望むことをする必要があります。 – shmosel

答えて

2

あなたの所望の出力を生成するために、あなたのハッシュマップをソートする必要はありません。代わりに、この

SortedSet<Integer> allKeysSorted = new TreeSet<Integer>(); 
allKeysSorted.addAll(h1.keySet()); 
allKeysSorted.addAll(h2.keySet()); 

ようTreeSetを使用して、両方のマップからキーの組合を含むTreeSet<Integer>を構築するには、あなたのキーがソートされることが保証されます。今、あなたは、allKeysSortedを繰り返す各マップから対応する値を取得し、それに応じて比較することができます:

for (Integer key : allKeysSorted) { 
    int v1, v2; 
    if (h1.containsKey(key)) { 
     v1 = h1.get(key); 
    } else { 
     v1 = 0; 
    } 
    if (h2.containsKey(key)) { 
     v2 = h2.get(key); 
    } else { 
     v2 = 0; 
    } 
    ... // Compare v1 and v2 here 
} 
1

あなたがマップを並べ替えできるようにする必要があります。

SortedSet<Integer> values1 = new TreeSet<Integer>(h1.keySet()); 
SortedSet<Integer> values2 = new TreeSet<Integer>(h2.keySet()); 

2つのセットの一意の値を持つセットを返す必要があります。最後に

Set<Integer> result = new SortedSet<Integer>(values1); 
    for (Integer element : values2) { 
     if (!h1.containsValue(h2.get(element)) { //If they don't share same value, add it to this new Set 
      result.add(element); 
     } 
     result.remove(element); //If they both share same value, remove it 
    } 

は、印刷するには:

Iterator iter = result.iterator(); 
while (iter.hasNext()) { 
    System.out.println(iter.next()); 
} 
0

一つの方法は、キーでエントリをソート新しいTreeMap、にそれらの値を減算することによってh1h2エントリをマージすることです。その後、我々はゼロに等しい値を持つエントリを削除できます。

Map<Integer, Integer> merged = new TreeMap<>(h1); // Copy h1 into merged 

h2.forEach((k2, v2) -> merged.merge(k2, v2, (oldVal, newVal) -> oldVal - newVal)); 

merged.values().removeIf(v -> v.equals(0)); 

キーを印刷するには、単にマップのキーセットを印刷することができます:一つ

System.out.println(merged.keySet()); 

またはそのキーを反復処理し、それらを1つずつ印刷します:

merged.keySet().forEach(System.out::println); 
+0

これは 'h2'からユニークなエントリを取得しません。 – shmosel

+0

@shmoselあなたのフィードバックのために修正されました。 –

関連する問題