2016-08-18 6 views
0

2つのクラスリストを持っている場合は、それらを比較して順序にかかわらず同じかどうかを確認できます。Java:注文に関係なく2つのクラスリストを比較する

Class[] list1[class1, class1, class2] 
Class[] list2[class2, class1, class1] 

これらのリストは、順序に関係なく同じですが、どのようにjavaブール値を使用できますか?例えば

if(list1.sort == list2.sort){} 
+2

クラスは '.getHashCode()'と '.equals()'を実装していますか? (あなたは文字通り 'Class'クラスを意味しますか?) – Ryan

+0

' Class'が 'java.lang.Class'であると仮定すると、funnilyは' hashCode() 'も' equals() 'も実装しません。 –

答えて

1

最善の解決策は、Guavaを追加し、MultiSetを使用するようになります。

HashMultiset<Class> hms1 = new HashMultiSet<>(); 
HashMultiset<Class> hms1 = new HashMultiSet<>(); 
for (Class c : list1) { 
    hms1.add(c); 
} 
for (Class c : list2) { 
    hms2.add(c); 
} 
if (hms1.equals(hms2) { 
    //lists are the same in your understanding of the same 
} 

簡単な解決策はMap<Class, Integer>

HashMap<Class, Integer> hm1 = new HashMap<>(); 
HashMap<Class, Integer> hm2 = new HashMap<>(); 
for (Class c : list1) { 
    if (!hm1.containsKey(c)) { 
     hm1.put(c, 1); 
    } else { 
     hm1.put(c, hm1.get(c)+1); 
    } 
} 
for (Class c : list2) { 
    if (!hm2.containsKey(c)) { 
     hm2.put(c, 1); 
    } else { 
     hm2.put(c, hm2.get(c)+1); 
    } 
} 
if (hm1.equals(hm2) { 
    //lists are the same in your understanding of the same 
} 
+0

HashMapソリューションでは、 'get()'と 'null'を比較する代わりに' containsKey() 'メソッドを使用できます –

+0

@ RayO'Kalahjanあなたは正しいです。更新された答え。あなたがアプローチ – xenteros

+1

に同意すればupvoteを自由に感じることができます。これは1つのハッシュマップでも行うことができます.2番目のループでは、最初のハッシュマップから削除/縮小し、最後にハッシュマップのサイズをチェックします。少ないメモリ。 – tonakai

0
Class<?>[] list1 = new Class[] { String.class, String.class, Integer.class }; 
    Class<?>[] list2 = new Class[] { Integer.class, String.class, String.class }; 

    Comparator<Class<?>> classComparator = new Comparator<Class<?>>() { 

     @Override 
     public int compare(Class<?> o1, Class<?> o2) { 
      return o1.getCanonicalName().compareTo(o2.getCanonicalName()); 
     } 
    }; 

    Arrays.sort(list1, classComparator); 
    Arrays.sort(list2, classComparator); 

    if (Arrays.equals(list1, list2)) { 
     System.out.println("same regardless of order"); 
    } else { 
     System.out.println("NOT same regardless of order"); 
    } 

上記プリント

same regardless of order 

私は、元のリストを変更していますを使用することです。これが望ましくない場合は、最初にコピーを取ることをお勧めします。

Arrays.equals()は、Class.equals()を使用しています。順番は、Object.equals()です。 ClassごとにClassオブジェクトが1つしかない限り、これは機能します。クラスローダを1つしか使用していない限り、これは当てはまると思います。だからここで少し微妙なことを警告してください。

関連する問題