排序集的最佳方法是什么?

时间:2014-03-26 19:34:43

标签: java collections

我有一个代表汽车的课程:

public class Car implements Comparable<Car> {
    String name;
    int value;
    ...
    @Override
    public int compareTo(Car o) {
        return name.compareTo(o.name);
    }
}

和另一个代表种族的类:

public class Race {
    cars = new HashSet<Car>();
    ...
    public Collection<Car> sortByName() {
        List<Car> carList = new ArrayList<>(cars);
        Collections.sort(carList);
        return carList;
    }
}

它是我对排序Set的实现,我知道有一个TreeSet,但我不知道如何通过TreeSet而不是HashSet进行比较,因为如果我使用TreeSet我无法找到方法comprator(),任何人都可以帮助我如果我做得好或如果不使用TreeSet?

2 个答案:

答案 0 :(得分:2)

以下是TreeSet javadoc

的摘录

A NavigableSet implementation based on a TreeMap. The elements are ordered using their natural ordering, or by a Comparator provided at set creation time, depending on which constructor is used.

自然排序是指通过使Car类实现Comparable接口来强制执行的顺序。只需将您的汽车添加到TreeSet实例,它们就会为您排序。

答案 1 :(得分:1)

Comparator中使用Comparable代替CarComparator是它所比较的​​类的外部,而Comparable是该类的内部。更详细的解释如下:https://stackoverflow.com/a/4108764/1838970

现在,问你的问题。实现此比较器:

public class CarComparatorByName implements Comparator<Car> {
    public int compare(Car o1, Car o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

现在使用Comparator

创建一个TreeSet
Set<Car> cars = new TreeSet<Car>(new CarComparatorByName());

TreeSet现在将使用您创建的比较器。

或者,如下面的评论中所述,您可以将Car保留为Comparable,并在创建时将它们放入TreeSetTreeSet Car implements Comparable将使用{{1}}中定义的自然排序顺序。