2017-01-13 51 views
5

Mam następujący kod, który będzie sortować Employees's na podstawie ich doświadczenia.Dane utracone z zestawu drzewiastego podczas korzystania z komparatora

Dodaję 2 pracowników z różnymi name i tym samym experience. Spodziewam się, że pod koniec set będą mieć 2 pracowników, ale dostaję tylko jeden.

Zastąpiłem także equals i hashcode, czy ktoś może mi powiedzieć, dlaczego dostaję tylko jednego pracownika w zestawie.

test klasa

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); 

    } 

} 

model Class

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(); 
    } 

} 

Odpowiedz

3

Dla SortedSet określa, które elementy są takie same i nie będzie zawierać duplikatów.Jeśli nie chcesz, aby rozważyć wszystkie pracowników z tego samego doświadczenia, aby być taka sama, trzeba dodać drugorzędną Kolejność:

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

Zauważ, że musisz włączyć wszystkie właściwości, które składają się na tożsamość pracownik. W twoim przykładzie istnieje tylko nazwa, ale w prawdziwych sytuacjach życiowych miałbyś więcej. Z drugiej strony, jeśli masz identyfikator, który określa tożsamość, nie musisz sprawdzać innych właściwości, a w rzeczywistości nie powinien być, ponieważ większość właściwości, w tym nazwa, może się zmienić. Dotyczy to również implementacji equals i hashCode.

Aby ostrzec o fałszywych założeniach dotyczących tego, co można uznać za przyznane, zmiany płci są faktem rzeczywistym, a nawet urodziny mogą okazać się fałszywe i wymagają korekty.

8

Ponieważ komparator nie jest zgodna z metodą równymi. Sprawdź dokumentację Comparator.

Kolejność nałożone porównawczym C na zestaw elementów S mówi być zgodne z równymi wtedy i tylko wtedy, gdy c.compare (E1, E2) == 0 ma samą wartość logiczną jako E1 .equals (E2) dla każdego E1 i E2 w S.

należy zachować ostrożność podczas korzystania z komparatora zdolnego nakładają zamawiania niezgodne z równymi zamówić klasyfikowane ustawić (lub sortowane mapa). Załóżmy, że posortowany zestaw (lub posortowana mapa) z wyraźnym porównaniem c jest używany z elementami (lub kluczami) narysowanymi z zestawu S. Jeśli porządek nałożony przez c na S jest niespójny z równymi, posortowany zbiór (lub posortowany) mapa) zachowa się "dziwnie". W szczególności posortowany zestaw (lub posortowana mapa) naruszy ogólny kontrakt na zestaw (lub mapę ), który jest zdefiniowany w kategoriach równych.

Dokładne zachowanie, które doświadczają jest napomknął w docs Comparable (chociaż użyć porównawczy):

Na przykład, jeśli ktoś dodaje dwa przyciski A i B takie, że (a.equals! (b) & & a.compareTo (b) == 0) do posortowanej zestaw, który nie korzysta z wyraźną komparator, druga operacja dodawania zwraca false (i wielkość uporządkowany zestaw nie zwiększa się), ponieważ i b są równoważne z perspektywą posortowanego zestawu.

W twoim przypadku: comparator.compare(e1, e2) jest 0, e1.equals(e2) jest false.

+0

dzięki za odpowiedź – Jobin