Рассказать HashSet, как сортировать данные

Я пытаюсь создать HashSet (или любой тип коллекции, но я думаю, что HashSet подойдет мне лучше всего), который останется в порядке, независимо от того, что вставлено. Это для проекта contact manager, над которым я работаю. Я экспериментировал с приведенным ниже примером.

import java.util.*;

public class TestDriver{

    public static void main(String[] args)
    {
        FullName person1 = new FullName("Stephen", "Harper");
        FullName person2 = new FullName("Jason", "Kenney");
        FullName person3 = new FullName("Peter", "MacKay");
        FullName person4 = new FullName("Rona", "Ambrose");
        FullName person5 = new FullName("Rona", "Aabrose");


        HashSet<FullName> names = new HashSet<FullName>();

        names.add(person3);
        names.add(person1);
        names.add(person4);
        names.add(person2);

        System.out.println(names);      
   } 
}

Я ожидал, что выходные данные поместят имена в алфавитном порядке - по крайней мере, в соответствии с их именем или фамилией. Однако я даже не могу различить метод HashSet, используемый для этого заказ;

[Jason Kenney, Rona Ambrose, Stephen Harper, Peter MacKay]

мой вопрос в том, как сказать моей программе, как сортировать имена на основе моих спецификаций?

5 ответов


HashSet не предоставляет никакого значимого порядка для записей. The документация говорит:

он не дает никаких гарантий относительно порядка итерации множества; в в частности, это не гарантирует, что порядок останется постоянным со временем.

чтобы получить разумный заказ, вам нужно использовать другую реализацию набора, такую как TreeSet или ConcurrentSkipListSet. Эти реализации SortedSet интерфейс позволит вам предоставить компаратор это указывает, как упорядочить записи; что-то вроде:

public class SortByLastName implements Comparator<FullName>{
    public int compare(FullName n1, FullName n2) {
        return n1.getLastName().compareTo(n2.getLastName());
    }
}

TreeSet<FullName> names = new TreeSet<FullName>(new SortByLastName());

вместо этого вы можете сделать класс FullName реализовать сравнима интерфейс, но это может быть бесполезно, если вы хотите иногда Сортировать по фамилии, иногда по имени или другим критериям.


использовать Treeset для натурального заказ.

HashSet--- not ordered/sorted
LinkedhashSet--- maintains insertion order
TreeSet--- sorts in natural order

для вашего случая используйте TreeSet вместо.


HashSet не сохраняет порядок, перейдите на TreeSet и реализовать свой собственный Comparator поручить TreeSet как сравнить

new TreeSet<FullName>(new Comparator<FullName>(){
        public int compare(Fullname one, FullName two{/*logic*/}
});

посмотреть


кажется, вам нужно TreeSet для достижения алфавитного порядка или LinkedHashSet сохранить порядок вставки.

обратите внимание, что ваш FullName необходимо реализовать Comparable<FullName> для того, чтобы использоваться в TreeSet (или вы должны предоставить внешний компаратор`).


попробуйте это:

 System.out.println(names.toList.sorted)