你可以给我一个提示,如何根据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();
之类的事情然后对其进行排序。但当然它不起作用。
答案 0 :(得分:1)
Set<Point> sortedPoints = points
.stream()
.sorted(Comparator.comparing(Point::getX))
.collect(Collectors.toCollection(LinkedHashSet::new));
我确信这种方式更好,因为: 1)关于你可以使用的大量积分
.paralellStream()
提高表现。
和
2)符号具有陈述式风格,看起来更清晰。
答案 1 :(得分:0)
任何实现Set
接口的SortedSet
都可以保持元素在其中排序。 TreeSet
是SortedSet
的已知实现。
您可以在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]);
但是,如果您的唯一目的是对数据进行排序,则应避免这样做。