-2

データベースから 2 つの Arraylists 値を取得します。同じ要素数と同じ順序を持つ 2 つの ArrayLists を取得します。

2 つの ArrayList を比較する必要があるテストを行っていました。

以下は、私が従ったアプローチを示すためのサンプル プログラムです。抜け穴がある場合はお知らせください。見落とす可能性があります。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Test {
    public static void main(String args[]) throws Exception {

        ArrayList<String> list1 = new ArrayList<String>();
        ArrayList<String> list2 = new ArrayList<String>();

        list1.add("Ravi");
        list1.add("fdfsd");
        list1.add("Sai");


        list2.add("Ravi");
        list2.add("fdfsd");
        list2.add("Sai");

        if(list1!=null && list2!=null){
                if(list1.size()==list2.size()){
                    for (int i = 0; i < list2.size(); i++) {
                        if (!list1.contains(list2.get(i))) {
                            System.out.println("Mismatch");

                        }
                    }

                    for (int i = 0; i < list1.size(); i++) {
                        if (!list2.contains(list1.get(i))) {
                            System.out.println("Mismatch");

                        }
                    }
                }else if(list1.size()!=list2.size()){
                    System.out.println("Mismatch");     
                }
        }
    }
}
4

3 に答える 3

5

まず、その 2 番目のループは必要ありません。最初のループ自体が仕事をします。そして第二に、使用の何が問題なのlist1.equals(list2);ですか? List#equals(Object o)ドキュメントから:

指定されたオブジェクトがこのリストと等しいかどうかを比較します。true指定されたオブジェクトもリストであり、両方のリストが同じサイズであり、2 つのリスト内の対応する要素のすべてのペアが等しい場合にのみ、を返します。(2 つの要素e1e2は、 の場合に等しいです(e1==null ? e2==null : e1.equals(e2))。) つまり、2 つのリストは、同じ要素が同じ順序で含まれている場合に等しいと定義されます。この定義により、equalsメソッドがインターフェイスのさまざまな実装で適切に機能することが保証されListます。

したがって、equals()リスト内の要素の順序が同じ場合にのみ機能します。また、これは、メソッドの要素タイプがメソッドをListsオーバーライドしない場合equals()、たとえば次の場合には機能しません。

List<int[]> list1 = Arrays.asList(new int[] {1, 2});
List<int[]> list2 = Arrays.asList(new int[] {1, 2});

System.out.println(list1.equals(list2));  // false

したがって、List<E>.equals()メソッドが機能するためには、要素の型Eをオーバーライドする必要がequals()あり、その結果としてもオーバーライドする必要がありますhashCode()。あなたの場合、String要素タイプとして持っているので、うまくいきます(もちろん、要素の順序が異なる場合を除きます)。

たとえば、これも失敗します。

List<String> list1 = Arrays.asList("a", "b");
List<String> list2 = Arrays.asList("b", "a");
list1.equals(list2);  // false

したがって、順序が重要な場合、つまり、リスト要素が同じ順序であるかどうかがわからない場合は、両方のリストを並べ替えequals()てから実行できます。

Collections.sort(list1);
Collections.sort(list2);
list1.equals(list2);  // true
于 2013-09-24T09:40:13.440 に答える
0

メソッドを使用してList#removeAll(Collection)、2 番目のリストが最初のリストから削除された後にリストのサイズを確認できます。0 より大きい場合は、不一致です。ただし、最初にサイズを確認する必要があります。

このようなもの:-

if (list1.size() == list2.size()) {
    list1.removeAll(list2);
    if (list1.size() == 0) {
        System.out.println("Match!");
    } else {
        System.out.println("Mismatch!");
    }
} else {
    System.out.println("Mismatch!");
}
于 2013-09-24T09:39:41.277 に答える