2016-01-03 4 views
2

У меня есть этот класс:Как правильно настроить гарнитуру?

public class Person implements{ 
private String name; 
private int height; 
... 
} 

Люди уступающий по высоте. Кажется разумным ожидать ситуации, когда два разных человека могут иметь одинаковый рост. Вот почему я написал эту Comparator:

public static class Compar implements Comparator<Person> { 
    @Override 
    public int compare(Person o1, Person o2) { 
     int r = Integer.compare(o1.height, o2.height); 
     return r == 0 ? o1.name.compareTo(o2.name) : r; 
    } 
} 

И это моя главная:

public static void main(String[] args){ 
    TreeSet<Person> ps = new TreeSet<>(new Compar()); 
    ps.add(new Person("Ann", 150)); 
    ps.add(new Person("Jane", 150)); 
    ps.add(new Person("John", 180)); 
    System.out.println(ps); 
} 

Я получил этот результат: Ann, высота = 150 Джейн, высота = 150 John, высота = 180. Но когда Я хочу использовать метод headSet, я ожидаю следующий результат: Ann, height = 150 Jane, height = 150, ничего не отображается в tr2.

TreeSet<Person> tr2 = new TreeSet<Person>(new Compar()); 
Person p = new Person("",150); 
tr2 = (TreeSet<Person>) ps.headSet(p,true); 

Как это исправить?

+0

Это похоже на вопрос типа «читать документы». Вы читали API TreeSet? Если да, то как насчет метода headSet вас сбивает с толку ? –

+0

Я читал о TreeSet и методе headSet, я понимаю, что он возвращает значения, которые строго меньше, но есть метод public SortedSet headSet (E toElement, boolean включительно), который может возвращать не строгие значения. Я не понимаю, как переопределить компаратор, чтобы этот вариант headSet работал – MyName

+1

Вы не меняете Comparator - все в порядке. Но в будущем (или даже сейчас), пожалуйста, разместите хорошо отформатированный код. Пожалуйста, помните, что вы просите добровольцев о помощи, и все, что вы можете сделать, облегчит другим понимание вашего кода, очень ценится. –

ответ

1

Да ничего не будет появляться в tr2 с момента .headSet() возвращает вид части этого набора, элементы которого являются строго менее, чем p (эксклюзив).

Все остальные Person объектов равны/выше p (150, 150, 180). Если они равны вы сравните их по name поле через ваш компараторе (так как вы прошли true в качестве второго параметра .headSet(). Поскольку p «s name пустая строка это меньше, чем другие имена и, следовательно, не включены.

Документация на это here, и я думаю, что вы ищете .tailSet().

+0

Я читал о TreeSet и методе headSet, я понимаю, что он возвращает значения, которые строго меньше, но существует метод public SortedSet headSet (E toElement, boolean включительно), который может возвращать не строгие значения. Я не понимаю, как переопределить компаратор, чтобы этот вариант headSet работал – MyName

+0

Нет? Это дает Энн, высота = 150 Джейн, высота = 150 Джан, высота = 180? но мне нужна только Энн, высота = 150 Джейн, высота = 150 – MyName

+0

О, я ошибаюсь. tr2 = (TreeSet ) ps.headSet (p, true); возвращает Ann, height = 150 Jane, height = 150 John, height = 180/Ваш вариант ничего не возвращает – MyName

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