2016-02-29 7 views
-1

Я видел проблему, заданную здесь раньше, но с тех пор мне не помогала, поэтому я снова спрашиваю ее с моей подлинной проблемой.java.util.TreeSet не соответствует договору о продлении контракта?

Я хочу удалить дублированный объект на основе всех свойств объекта (здесь Name, id, CompanyName, Address). Вот мой код:

package CollectionDemo; 
import java.util.TreeSet; 
class Employee implements Comparable<Employee> { 
    String Name; 
    int id; 
    String CompanyName; 
    String Address; 
    public Employee(String Name,int id,String CompanyName,String Address) { 
     this.Name = Name; 
     this.id = id; 
     this.CompanyName = CompanyName; 
     this.Address = Address; 
    } 
    @Override 
    public String toString() { 
     return "Name : "+this.Name+"\tID : "+this.id+"\tCompanyName : "+this.CompanyName+"\tAddress : "+this.Address; 
    } 
    @Override 
    public int compareTo(Employee obj){ 
     if((this.Name.equals(obj.Name))&&(this.id==obj.id)&&(this.CompanyName.equals(obj.CompanyName))&&(this.Address.equals(obj.Address))) { 
      return 0; 
     } 
     return 1; 
    } 
} 

public class DemoTreeset { 

    public static void main(String[] args) { 
     TreeSet<Employee> ts = new TreeSet<>(); 
     ts.add(new Employee("Panda", 11, "Google", "California")); 
     ts.add(new Employee("Panda", 12, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Google", "California")); 
     ts.add(new Employee("Panda", 13, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Infosys", "India")); 
     ts.add(new Employee("Panda", 11, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Infosys", "India")); 
     ts.add(new Employee("Panda", 12, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Google", "California")); 
     ts.add(new Employee("Panda", 13, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Infosys", "India")); 
     ts.add(new Employee("Panda", 11, "Google", "California")); 
     ts.add(new Employee("Panda", 11, "Infosys", "India")); 
     for(Employee e : ts) { 
      System.out.println(e); 
     } 
    } 
} 

ВЫВОД:

Name : Panda ID : 11 CompanyName : Google Address : California 
Name : Panda ID : 12 CompanyName : Google Address : California 
Name : Panda ID : 13 CompanyName : Google Address : California 
Name : Panda ID : 11 CompanyName : Google Address : California 
Name : Panda ID : 11 CompanyName : Infosys Address : India 
Name : Panda ID : 13 CompanyName : Google Address : California 

Я знаю TreeSet использует compareTo() вместо equals() сравнивать объекты, так что я переопределить его, но как вы можете видеть результат, удалены некоторые дубликаты, но не все из них. Я не понимаю, почему я получаю этот результат. Почему он не удаляет все дубликаты, а лишь немногие из них?

+0

Как можно что-либо (не говоря уже о 'TreeSet') использовать' equals() 'для _компьютера objects_? –

+0

@KedarMhaswade Я сказал TreeSet Использует compareTo() вместо equals() для сравнения объектов ... –

+1

Короткий ответ: ваша реализация 'compareTo' _massively_ нарушает контракт для этого метода, а' TreeSet' не может помочь вам когда вы даете ему бессмысленные реализации. –

ответ

0

Вы можете проверить это? Выход:

Имя: Panda ID: 11 НазваниеКомпании: Google Адрес: California

Имя: Panda ID: 12 НазваниеКомпании: Google Адрес: California

Имя: Panda ID: 13 НазваниеКомпании: Google Адрес: California

Имя: Panda ID: 11 НазваниеКомпании: Инфосис Адрес: Индия

package algorithms; 

import java.util.TreeSet; 

class Employee implements Comparable<Employee> { 
String Name; 
int id; 
String CompanyName; 
String Address; 

public Employee(String Name,int id,String CompanyName,String Address) { 
    this.Name = Name; 
    this.id = id; 
    this.CompanyName = CompanyName; 
    this.Address = Address; 
} 

@Override 
public String toString() { 
    return "Name : "+this.Name+"\tID : "+this.id+"\tCompanyName : "+this.CompanyName+"\tAddress : "+this.Address; 
} 

@Override 
public int compareTo(Employee obj){ 
    final int BEFORE = -1; 
    final int EQUAL = 0; 
    final int AFTER = 1; 

    if (this.equals(obj)) return EQUAL; 

    int comparison = this.Name.compareTo(obj.Name); 
    if (comparison != EQUAL) return comparison; 

    comparison = this.Address.compareTo(obj.Address); 
    if (comparison != EQUAL) return comparison; 

    comparison = this.CompanyName.compareTo(obj.CompanyName); 
    if (comparison != EQUAL) return comparison; 

    comparison = ((Integer)(this.id)).compareTo(obj.id); 
    if (comparison != EQUAL) return comparison; 

    return EQUAL; 
} 

    @Override 
    public boolean equals(Object aThat) { 
     if (this == aThat) return true; 
     if (!(aThat instanceof Employee)) return false; 

     Employee that = (Employee)aThat; 
     return 
      (this.Address.equals(that.Address)) && 
      (this.id == that.id) && 
      (this.Name.equals(that.Name)) && 
      (this.CompanyName.equals(that.CompanyName)) 
     ; 
    } 
} 


public class DemoTreeSet { 

public static void main(String[] args) { 
    TreeSet<Employee> ts = new TreeSet<>(); 
    ts.add(new Employee("Panda", 11, "Google", "California")); 
    ts.add(new Employee("Panda", 12, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Google", "California")); 
    ts.add(new Employee("Panda", 13, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Infosys", "India")); 
    ts.add(new Employee("Panda", 11, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Infosys", "India")); 
    ts.add(new Employee("Panda", 12, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Google", "California")); 
    ts.add(new Employee("Panda", 13, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Infosys", "India")); 
    ts.add(new Employee("Panda", 11, "Google", "California")); 
    ts.add(new Employee("Panda", 11, "Infosys", "India")); 
    for(Employee e : ts) { 
     System.out.println(e); 
    } 
} 

+0

теперь ans отлично ... спасибо за помощь, сэр ... это очень помогло ... :) –

3

При реализации контракта, определенного интерфейсом Comparable, вам необходимо соблюдать все аспекты, требуемые контрактом для реализации. Частично соблюдение контракта приведет к странному поведению так же, как и в вашем случае. Одно очевидное упущение от вашей реализации контракта Comparable - транзитивность. Из javadoc метода Comparable.compareTo(...):

реализатор должен также гарантировать, что отношение транзитивно: (x.compareTo(y)>0 && y.compareTo(z)>0) подразумевает x.compareTo(z)>0.

Ваша реализация, безусловно, не транзитивна.

+1

И в частности, вы всегда возвращаете 1 («этот объект больше аргумента»), если они не равны. Это означает, что «a»> «b» и «b»> «a» (так как оба будут видеть другое как не равное и, следовательно, возвращать 1), что, очевидно, не выполняется. – yshavit

+0

@yshavit m делать это becoz я просто хочу проверить на наличие дубликатов объектов ... если obj равно arg return 0 else return 1 или -1 ... Что я могу вернуть, если не 1 или -1? –

+0

Правильно выполните метод compareTo, и он будет работать нормально. Создайте ** согласованный ** порядок и уважайте договор «Сопоставимый», и все начнет работать ;-) –

 Смежные вопросы

  • Нет связанных вопросов^_^