2012-06-29 13 views
5

मेरे पास दो सरणी सूची हैं। प्रत्येक प्रकार के प्रकार के कर्मचारी की सूची है।संपत्ति के आधार पर दो ऐरे सूचियों के बीच अंतर कैसे प्राप्त करें?

कर्मचारी वर्ग की तरह

नीचे
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 

} 

मैं कर्मचारी वस्तु जो कर्मचारी आईडी है की एक संपत्ति के आधार पर दो सूचियों के बीच मतभेदों को खोजने की जरूरत है लग रहा है।

कर्मचारी आईडी मैन्युअल रूप से प्रत्येक कर्मचारी को दी गई अद्वितीय आईडी उत्पन्न होती है।

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

यदि आपकी वस्तुएं सुसंगत नहीं हैं तो क्या होता है? उदाहरण के लिए, यदि सूची 1 में ("एफ 1", "एल 1", "ईएमपीओ 1") है और सूची 2 में ("एफ 11", "एल 11", "ईएमपी 01") शामिल है। क्या वह दूसरी सूची में नहीं लौटाया जाएगा, भले ही कुंजी एक जैसी हो? –

+0

@ डिस्को 3. हम सिर्फ अलग कर्मचारी आईडी की तलाश में हैं। आपके मामले में वे एक जैसा दिखाई देंगे। – ashishjmeshram

+0

आपके कर्मचारी वर्ग को तुलनात्मक रूप से लागू करने की आवश्यकता होगी –

उत्तर

6

अवहेलना अपने Employee वर्ग के equals() और hashcode() तरीकों केवल employeeId उपयोग करने के लिए जब समानता के लिए जाँच (आईएम यकीन है कि के बारे में तुम क्यों id क्षेत्र की जरूरत नहीं। आप क्या यह रूप में अच्छी तरह शामिल करने के लिए हो सकता है)। NetBeans/ग्रहण आईडीई आपके लिए यह कर सकते हैं। फिर आप अपनी मूल सूचियों के कॉपी कर सकते हैं और अंतर की गणना करने के लिए List.removeAll() का उपयोग कर सकते हैं।

0

आपकी सूचियां वास्तव में सूचियां नहीं हैं, क्या वे हैं? वे वास्तव में परिभाषित आदेश के बिना कर्मचारियों के सेट हैं। यदि उनके पास एक निर्धारित आदेश है तो उन्हें तुलना करना आसान होगा। कर्मचारी आईडी के लिए एक तुलनाकर्ता परिभाषित करें और दो सरणी को सॉर्ट करने के लिए Collections.sort का उपयोग करें। फिर आपको एक अंतर एल्गोरिदम लागू करने की आवश्यकता है। मुझे कोई अच्छा सामान्य नहीं दिख रहा है। आप अपनी क्रमबद्ध सूची को एक्सएमएल में बदल सकते हैं और फिर मतभेद प्राप्त करने के लिए XMLUnit's Diff class का उपयोग कर सकते हैं। आप इसे स्ट्रिंग्स की सूची के रूप में प्रस्तुत कर सकते हैं और textual diff लागू कर सकते हैं। यदि आप अपने उपयोग के मामले में एक विशिष्ट को कार्यान्वित करना चाहते हैं तो अंतर एल्गोरिदम पर discussion यहां दिया गया है।

+0

क्या संग्रह फ्रेमरोक स्वयं कुछ भी नहीं है जो ऐसा करेगा जैसा कि अन्य बराबर और आदि का उपयोग करने के लिए कह रहे हैं। – ashishjmeshram

+0

यह उत्तर आपके उपयोग के मामले के लिए अधिक है। मैं एक अलग लिख रहा हूँ। –

0

सूची में विधि removeAll का उपयोग करें:, तो बाद

list1.removeAll(list2); 

इस विधि List1 और List2 में सभी आम तत्व निकाल देंगे इस विधि List1 बुला कर्मचारी आईडी नीचे होता है इन से अलग हैं इस रूप में List2 EMP03 EMP04 EMP05

और कर्मचारी में बराबर विधि ओवरराइड कक्षा

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

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

    } 
0

कर्मचारियों की दोनों सूचियां इसके बजाय मानचित्र में रखें। कुंजी है। मान employee ऑब्जेक्ट है। फिर @AndrewButenko के रूप में removeAll का उपयोग करें। सूचियों की तुलना में आपको अधिक कुशल लुकअप के लिए नक्शे का उपयोग करना चाहिए। (निष्कासन में लुकअप शामिल है।) मैं सेट की अनुशंसा करता हूं, लेकिन फिर आपको equals और hashcode को लागू करने की आवश्यकता होगी। वे स्ट्रिंग के लिए पहले ही लागू हो चुके हैं।

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 उपयोग कर सकते हैं।

संबंधित मुद्दे