2013-08-10 1 views
0

Я пытаюсь понять набор деревьев. Зачем нужна только печатьПочему итератор не извлекает оставшиеся объекты?

a не b и c.

Ниже приведен индекс:

Set<Person> tr = new TreeSet<Person>(); 

    tr.add(new Person("a",1)); 
     tr.add(new Person("c",7)); 
     tr.add(new Person("5",5)); 

     Iterator itr = tr.iterator(); 
     while(itr.hasNext()) 
     { 

      Person person = (Person) itr.next(); 
      System.out.println(person.getName()); 
     } 

Person Класс

package com.set; 

public class Person implements Comparable<Person>{ 

    private String name; 

    private int age; 


    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 
    public Person(String name , int age) { 
     this.name= name; 
     this.age = age; 
    } 
    public String getName() { 
     return name; 
    } 

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

    @Override 
    public int compareTo(Person o) { 

      if(age > o.getAge()) 
      { 
       return 0; 
      }else{ 
       return 1; 
      } 

    } 


} 
+2

Покажите нам свой метод hashcode и equals вашего лица – harrybvp

+0

Возможно, что-то не так с вашим классом Person. Можете ли вы поделиться этим? –

+0

Вы перегрузили 'equals()'/'compareTo()' в 'Person'? – kiheru

ответ

0

Для сортировки по возрасту вам необходимо учитывать оба направления, которые могут отличаться. Кроме того, чтобы сохранить compareTo() в соответствии с равными, вы должны также учитывать имена, если возрасты одинаковы.

@Override 
public int compareTo(Person o) { 
    int ret = age - o.getAge(); 
    if (ref == 0) { 
     return name.compareTo(o.getName()); 
    } 
    return ret; 
} 

@Override 
public boolean equals(Object o) { 
    if (o instanceof Person) { 
     Person p = (Person) o; 
     return p.getAge() == age && p.getName().equals(name); 
    } 
    return false; 
} 
0

Возврат 0 из вашей CompareTo() только тогда, когда возраст обоих объектов составляет

@Override

public int compareTo (Person o) {

if(age == o.getAge()) 
    { 
     return 0; 
    }else{ 
     return 1; 
    } 

}

+0

Он дал бы исключение, если бы я не написал код для метода compareTO. – Thinker

+0

@Thinker Я имею в виду реализацию по умолчанию compareTo() – Algorithmist

0

Это правильный код. Для использования TreeSet класс Person должен реализовать интерфейс Comparable (он не будет компилироваться в противном случае). Если код не печатает все элементы, то это означает, что вы реализовали метод compareTo таким образом, что все там Person объекты рассматриваются как один, так

(new Person("a",1)).compareTo(new Person("c",7)) == 0 
(new Person("a",1)).compareTo(new Person("5",5)) == 0 

если, например, вы хотели бы Person чтобы определить по их имени (объект String), это может быть записано как

public class Person implements Comparable<Person>{ 
    String name; 
    int age; 
    private Person(String name, int age) { 
     this.name=name; 
     this.age=age; 
    } 

    private String getName() { 
     return name; 
    } 

    @Override 
    public int compareTo(Person o) { 
     return name.compareTo(o.name); 
    } 
} 

, который печатает

5 
a 
c 

, если вы хотите использовать целую пару данных в качестве идентификатора, то было бы разумнее использовать HashSet (так как требуется только определить, когда объекты равны, а TreeSet в качестве упорядоченной структуры данных требует своего рода упорядочения, что вы объявляете метод compareTo.

0

Проблема с вашим методом CompareTo:

@Override 
public int compareTo(Person o) { 

     if(age > o.getAge()) 
     { 
      return 0; 
     }else{ 
      return 1; 
     } 

} 

TreeSet использует СотрагеТо() используется для определения равенства объектов. И ваша реализация compareTo вернет 0 во всех случаях, когда новый возраст объекта больше, чем существующий элемент.

+0

Как я могу его изменить – Thinker

+0

@Thinker см. Мой обновленный ответ – Algorithmist

0

Проблема с методом comapreTo, изменять как этот

@Override 
public int compareTo(Person o) { 

    if(age == o.getAge()) 
    { 
     return 0; 
    }else if(age>o.getAge(){ 
     return 1; 
    }else{ 
     return -1; 
    } 
} 

в соответствии с Явы docs

метод comapreTo() Сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.

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