HashSet <point>:如何根据x坐标对所有点进行排序?

时间:2017-11-15 11:12:13

标签: java sorting hashset point

你可以给我一个提示,如何根据O(nLogn)中的x坐标对点进行排序吗?

    Set<Point> points = new HashSet<Point>();
    points.add(new Point(9, 0));
    points.add(new Point(1, 1));
    points.add(new Point(5, 6));
    points.add(new Point(3, 3));
    points.add(new Point(2, 7));
    points.add(new Point(1, 8));
    points.add(new Point(6, 1));

我希望我可以做Point[] points2 = points.toArray();之类的事情然后对其进行排序。但当然它不起作用。

2 个答案:

答案 0 :(得分:1)

Set<Point> sortedPoints = points
                        .stream()                                    
                        .sorted(Comparator.comparing(Point::getX))
                        .collect(Collectors.toCollection(LinkedHashSet::new));

我确信这种方式更好,因为: 1)关于你可以使用的大量积分

.paralellStream()

提高表现。

2)符号具有陈述式风格,看起来更清晰。

答案 1 :(得分:0)

任何实现Set接口的SortedSet都可以保持元素在其中排序。 TreeSetSortedSet的已知实现。

您可以在TreeSet构造函数中为您的类传递自定义Comparator,以获取根据您的条件排序的集合。

public static void main(String[] args) {
    SortedSet<Point> points = new TreeSet<>(new Comparator<Point>() {
        @Override
        public int compare(Point o1, Point o2) {
            return o1.getX()- o2.getX();
        }
    });
    points.add(new Point(9, 0));
    points.add(new Point(1, 1));
    points.add(new Point(5, 6));
    points.add(new Point(3, 3));
    points.add(new Point(2, 7));
    points.add(new Point(1, 8));
    points.add(new Point(6, 1));
}

如果比较器代码看起来很详细,您可以尝试新的Java 8样式比较器声明。

SortedSet<Point> points = new TreeSet<>(Comparator.comparing(Point::getX));

关于最后一点,如果你想从Set获得一个数组,你总是可以通过以下方式来实现:

Point[] points2 = points.toArray(new Point[0]);

但是,如果您的唯一目的是对数据进行排序,则应避免这样做。