5

2 つの配列リストがあります。それぞれに従業員タイプのオブジェクトのリストがあります。

Employee クラスは以下のようになります

    public class Employee {

    Employee(String firstname, String lastname, String employeeId) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.employeeId = employeeId;
    }

    private int id; // this is the primary key from employee table

    private String firstname;

    private String lastname;

    private String employeeId; // manually assigned unique id to each employee

    // getters and setters

}

従業員 ID である従業員オブジェクトのプロパティに基づいて、2 つのリストの違いを見つける必要があります。

従業員 ID は、各従業員に与えられる手動で生成された一意の ID です。

    import java.util.ArrayList;
import java.util.List;


public class FindDifferences {

    public static void main(String args[]){
        List<Employee> list1 = new ArrayList<Employee>(); 
        List<Employee> list2 = new ArrayList<Employee>(); 

        list1.add(new Employee("F1", "L1", "EMP01"));
        list1.add(new Employee("F2", "L2", "EMP02"));
        list1.add(new Employee("F3", "L3", "EMP03"));
        list1.add(new Employee("F4", "L4", "EMP04"));
        list1.add(new Employee("F5", "L5", "EMP05"));

        list2.add(new Employee("F1", "L1", "EMP01"));
        list2.add(new Employee("F2", "L2", "EMP02"));
        list2.add(new Employee("F6", "L6", "EMP06"));
        list2.add(new Employee("F7", "L7", "EMP07"));
        list2.add(new Employee("F8", "L8", "EMP08"));

        List<Employee> notPresentInList1 = new ArrayList<Employee>(); 
        // this list should contain EMP06, EMP07 and EMP08

        List<Employee> notPresentInList2= new ArrayList<Employee>(); 
        // this list should contain EMP03, EMP04 and EMP05



    }

}
4

4 に答える 4

7

クラスのオーバーライドequals()hashcode()メソッドは、等しいかどうかをチェックするときEmployeeにのみ使用しますemployeeId(フィールドが必要な理由がわかりませんid。フィールドを組み込む場合もあります)。NetBeans /EclipseIDEがこれを実行できます。次に、元のリストのコピーList.removeAll()を作成し、それを使用して差を計算できます。

于 2012-06-29T11:19:37.960 に答える
0

あなたのリストは真のリストではありませんね。彼らは実際には定義された順序のない一連の従業員です。順序が決まっていると比較しやすいです。employeeId の Comparator を定義し、Collections.sort を使用して 2 つの配列を並べ替えます。次に、差分アルゴリズムを適用する必要があります。良いジェネリックは見当たりません。並べ替えられたリストを XML に変換し、XMLUnit の Diff クラスを使用して違いを取得できます。文字列のリストとしてレンダリングし、テキストの diffを適用できます。ユース ケースに固有のアルゴリズムを実装する場合は、差分アルゴリズムに関する説明を次に示します。

于 2012-06-29T11:20:53.720 に答える
0

リストに対してメソッド removeAll を使用します。

list1.removeAll(list2);

このメソッドは、 list1 と list2 のすべての共通要素を削除します。したがって、このメソッドを呼び出した後、 list1 には、 list2 EMP03 EMP04 EMP05 から一意であるため、以下の従業員 ID が含まれます。

そして、従業員クラスの equals メソッドをオーバーライドします

     @Override
    public boolean equals(Object obj) {
        Employee employee = (Employee)obj;

        if ( this.employeeId.equalsIgnoreCase(employee.employeeId)){
            return true;
        }
        return false;

    }
于 2012-06-29T11:27:06.210 に答える
0

代わりに、従業員の両方のリストをマップに入れます。キーはemployeeIdです。値はemployeeオブジェクトです。次にremoveAll、@AndrewButenkoが提案したように使用します。リストよりも効率的な検索には、マップを使用する必要があります。(削除にはルックアップが必要です。) set をお勧めしますが、その場合は and を実装する必要がありequalsますhashcode。それらはすでに String に実装されています。

Map<String, Employee> map1 = new HashMap<String, Employee>();
for (Employee e : list1) {
    map1.put(e.getEmployeeId(), e);
}
Map<String, Employee> map2 = new HashMap<String, Employee>();
for (Employee e : list2) {
    map2.put(e.getEmployeeId(), e);
}

// clone makes sure we don't mess with the original map2 because we will reuse it
Collection<Employee> notPresentInList1 = map2.clone().removeAll(map1).values();

Collection<Employee> notPresentInList2 = map1.removeAll(map2).values();

結果の順序が気になる場合は、コレクションを最後に並べ替えるか、TreeMap代わりに使用することができます。

于 2012-06-29T11:27:44.523 に答える