Dodałem kilka prostych obiektów do zestawu TreeSet, ale gdy zadzwonię do metod usuwania() i zawiera() TreeSet, nie działają. Jednak po przejściu przez zestaw obiekt zostanie wydrukowany. Obiekty pracownicze zostaną dodane do zestawu, podczas gdy unikalność obiektów jest oparta na właściwości nazwy obiektów. Właściwość Id to wartość, którą należy posortować, ale która nie jest unikalna.Java TreeSet: remove and contains() does not working
public class Employee {
private String name;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// Two objects are considered equal if their names are equal
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (this == o)
return true;
if (o.getClass() == this.getClass()) {
Employee p = (Employee) o;
if (p.getName() != null && this.getName() != null)
return this.getName().equals(p.getName());
else
return false;
} else {
return false;
}
}
}
//*******************************************************
public class EmployeeComp implements Comparator<Employee> {
// Sort Ids, but allow duplicates, hence this function is never returning 0
@Override
public int compare(Employee p1, Employee p2) {
int re = 0;
boolean scoreLt = (p1.getId() > p2.getId());
boolean scoreGt = (p1.getId() < p2.getId());
if(scoreLt)
re = -1;
if(scoreGt)
re = 1;
else
re = -1;
return re;
}
}
//*******************************************************
// Collection shall store unique names with ordered values like:
// Alex, 923
// Toni, 728
// Eddi, 232
// Peter, 232
// Eddi, 156 *** not allowed
import java.util.TreeSet;
public class Main {
private static EmployeeComp comp = new EmployeeComp();
private static TreeSet<Employee> employees = new TreeSet<Employee>(comp);
public static void main(String[] args) {
Employee p1 = new Employee();
p1.setName("Eddi");
p1.setId(232);
Employee p2 = new Employee();
p2.setName("Toni");
p2.setId(728);
Employee p3 = new Employee();
p3.setName("Peter");
p3.setId(232);
Employee p4 = new Employee();
p4.setName("Alex");
p4.setId(923);
employees.add(p1);
employees.add(p2);
employees.add(p3);
employees.add(p4);
// Here, contains() and remove() should check the object address
// and not perform their actions based on compareTo
}
}
Nie, zrobiłem to pierwszy, ale zauważył go później, więc to nie może być reaosn. – user1812379
@ upewnij się, prawda, przeoczyłem to. –
OK, zobacz rozwiązanie i jedną rzecz, o której musisz pamiętać: nie możesz zrobić tego, czego chcesz, używając '.equals()'/'.hashCode() 'lub samego' Comparator' - nie możesz mieć obu ciasto i zjedz to. Mój przykład "BigDecimal" powinien już dać ci wskazówkę! – fge