2012-06-29 13 views
5

私は2つの配列リストを持っています。それぞれには、Employee型のオブジェクトのリストがあります。プロパティに基づいて2つの配列リストの違いを見つける方法は?

Employeeクラスは、私は従業員IDである従業員オブジェクトのプロパティに基づいて、2つのリストの間の相違点を見つける必要があり

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は、各従業員に手動で生成された一意のIDです。

平等をチェックするときにのみ employeeIdを使用するように Employeeクラスの
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 



    } 

} 
+0

オブジェクトに一貫性がない場合はどうなりますか?たとえば、list1に "F1"、 "L1"、 "EMPO1"が含まれ、list2に "F11"、 "L11"、 "EMP01"が含まれているとします。たとえキーが同じであっても、それは他のリストにないとして返されますか? –

+0

@Disco 3.私たちは、異なる従業員IDを探しています。あなたの場合、彼らは同じと見なされます。 – ashishjmeshram

+0

EmployeeクラスはComparableを実装する必要があります –

答えて

6

オーバーライドequals()hashcode()方法は(あなたがidフィールドを必要とする理由がわからないイム。あなたは可能性があるとしても、それを組み込むために何を)。 NetBeans/Eclipse IDEでこれを行うことができます。次に、元のリストのコピーを作成し、差異を計算するにはList.removeAll()を使用します。

0

あなたのリストは本当にリストではありませんか?彼らは実際に定義された順序のない従業員のセットです。彼らは定義された順序を持っている場合、比較するのが簡単になります。 employeeIdのComparatorを定義し、Collections.sortを使用して2つの配列をソートします。次に、差分アルゴリズムを適用する必要があります。私は良い一般的なものは表示されません。ソートされたリストをXMLに変換してから、XMLUnit's Diff classを使用して違いを得ることができます。あなたはそれを文字列のリストとしてレンダリングし、textual diffを適用することができます。ユースケースに固有のアルゴリズムを実装する場合は、差分アルゴリズムに関するdiscussionがあります。

+0

他にはequalsToなどを使用しているので、これを行うコレクションframewrok自体はありません。 – ashishjmeshram

+0

あなたのユースケースでは、この回答は過剰です。私は別のものを書いている。 –

0

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

list1.removeAll(list2); 

この方法は、リスト1とリスト2のすべての共通の要素を削除し、したがって、これらは EMP03 LIST2からユニークであるとして従業員IDの下に含まれているリスト1このメソッドを呼び出した後になりますEMP04 EMP05

と従業員で、equalsメソッドをオーバーライドするクラス

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

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

    } 
0

代わりに両方の従業員のリストをマップに入れます。キーはemployeeIdです。値はemployeeオブジェクトです。 @AndrewButenkoが示唆しているようにremoveAllを使用してください。リストよりも効率的なルックアップのためにマップを使うべきです。 (削除にはルックアップが必要です)私はsetを推奨しますが、equalshashcodeを実装する必要があります。それらは既に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を使用することができます。

関連する問題