2017-01-13 13 views
5

का उपयोग करते समय ट्रीसेट से खो गया डेटा मेरे पास निम्न कोड है जो Employees's को उनके अनुभव के आधार पर सॉर्ट करेगा।तुलनात्मक डेटा

मैं अलग-अलग name और उसी experience के साथ 2 कर्मचारियों को जोड़ रहा हूं। मुझे उम्मीद है कि अंत में set में 2 कर्मचारी होंगे, लेकिन मुझे केवल एक ही मिल रहा है।

मैंने equals और hashcode पर भी ओवरराइड किया है, क्या कोई मुझे बता सकता है कि मुझे सेट में केवल एक कर्मचारी क्यों मिल रहा है।

टेस्ट कक्षा

import java.util.Comparator; 
import java.util.Set; 
import java.util.TreeSet; 

import org.apache.commons.lang3.builder.EqualsBuilder; 
import org.apache.commons.lang3.builder.HashCodeBuilder; 
import org.junit.Test; 

public class SetWithComparator { 


    @Test 
    public void testComparatorWithSet() { 

     Comparator<Employee> comparator = 
       (emp1, emp2) -> emp1.getYearOFExp().compareTo(emp2.getYearOFExp()); 

     Set<Employee> empSet = new TreeSet<>(comparator); 

     Employee e1 = new Employee(); 
     e1.setName("Employee-1"); 
     e1.setYearOFExp(12f); 

     Employee e2 = new Employee(); 
     e2.setName("Employee-2"); 
     e2.setYearOFExp(12f); 

     empSet.add(e1); 
     empSet.add(e2); 

    } 

} 

मॉडल कक्षा

class Employee { 


    private String name; 
    private Float yearOFExp; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Float getYearOFExp() { 
     return yearOFExp; 
    } 

    public void setYearOFExp(Float yearOFExp) { 
     this.yearOFExp = yearOFExp; 
    } 

    @Override 
    public boolean equals(Object obj) { 

     if (obj instanceof Employee) { 

      Employee e = (Employee) obj; 
      return new EqualsBuilder().append(name, e.getName()).isEquals(); 
     } else { 
      return false; 
     } 

    } 

    @Override 
    public int hashCode() { 
     return new HashCodeBuilder().append(name).toHashCode(); 
    } 

} 

उत्तर

3

SortedSet के लिए, Comparator निर्धारित करता है कि कौन से तत्व समान हैं और इसमें डुप्लिकेट नहीं होंगे।

Comparator<Employee> comparator = Comparator.comparing(Employee::getYearOFExp) 
              .thenComparing(Employee::getName); 

नोट आपको लगता है कि की पहचान बनाने सभी गुण शामिल करने के लिए है कि: आप एक ही होने के लिए एक ही अनुभव के साथ सभी कर्मचारियों को विचार करने के लिए नहीं करना चाहते हैं, तो आप एक उच्च माध्यमिक आदेश जोड़ने के लिए एक कर्मचारी। आपके उदाहरण में, केवल नाम ही है, हालांकि, वास्तविक जीवन परिदृश्य में आपके पास और अधिक होगा। दूसरी तरफ, यदि आपके पास एक आईडी है, जो पहचान निर्धारित करती है, तो आपको अन्य गुणों की जांच करने की आवश्यकता नहीं है और वास्तव में, नहीं होना चाहिए, क्योंकि नाम सहित अधिकांश गुण बदल सकते हैं। यह equals और hashCode के कार्यान्वयन पर भी लागू होता है।

क्या माना जा सकता है के बारे में झूठी धारणाओं के बारे में चेतावनी देने के लिए, लिंग परिवर्तन वास्तविक जीवन तथ्य हैं और यहां तक ​​कि जन्मदिन भी झूठ साबित हो सकते हैं और सुधार की आवश्यकता है।

8

क्योंकि तुलनित्र अपने बराबर विधि के अनुरूप नहीं है। कृपया Comparator के दस्तावेज़ीकरण की जांच करें।

आदेश तत्वों एस का एक सेट पर एक तुलनित्र ग द्वारा लगाए गए कहा जाता है कि यदि और केवल यदि c.compare (E1, E2) == 0 E1 के रूप में ही बूलियन मान है बराबरी के अनुरूप होना करने के लिए जब एक तुलनित्र करने में सक्षम का उपयोग कर ऑर्डर करने के लिए असंगत एक आदेश थोप बराबरी के साथ हर E1 और एस

सावधानी e2 के लिए .equals (E2) प्रयोग किया जाना चाहिए एक हल कर (या हल कर नक्शा) की स्थापना की। मान लीजिए कि एक स्पष्ट तुलनित्र सी के साथ एक क्रमबद्ध सेट (या क्रमबद्ध मानचित्र) का उपयोग सेट एस से निकाले गए तत्वों (या कुंजी) के साथ किया जाता है। यदि एस पर सी द्वारा लगाया गया क्रम बराबर के साथ असंगत है, क्रमबद्ध सेट (या क्रमबद्ध नक्शा) "अजीब तरह से व्यवहार करेगा।" विशेष रूप से क्रमबद्ध सेट (या क्रमबद्ध नक्शा) सेट (या मानचित्र) के लिए सामान्य अनुबंध का उल्लंघन करेगा, जिसे बराबर के संदर्भ में परिभाषित किया गया है।

सही व्यवहार है कि आप अनुभव Comparable की डॉक्स में संकेत दिया जाता है (हालांकि आप तुलनित्र का उपयोग करें):

उदाहरण के लिए, अगर एक दो चाबियाँ ए और बी ऐसा है कि (a.equals कहते हैं! (ख) & & a.compareTo (ख) == 0) एक क्रमबद्ध सेट है कि एक स्पष्ट तुलनित्र का उपयोग नहीं करता है, दूसरा ऐड आपरेशन रिटर्न झूठी (और) के आकार क्रमबद्ध सेट में वृद्धि नहीं करता एक वजह और बी क्रमबद्ध सेट के परिप्रेक्ष्य के बराबर हैं।

आपके मामले में: comparator.compare(e1, e2)0 है, e1.equals(e2)false है।

+0

उत्तर के लिए धन्यवाद – Jobin

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