我是一名Ruby开发人员,多亏了Android平台,我将给Java一个机会。
我有一组2D点[p1,p2,p3,p4 ... p10],我想重新排序集合,按点的x值排序。在Ruby中我会做这样的事情:
points.sort! {|a,b| a.x <=> b.x}
我希望能够在Ruby中插入现有的点之间的新点:
points.insert(3, point)
实现这一目标的最佳Java实践是什么?
点是否应存储在数组中,以及我设计的排序和插入机制?
或者已经存在一个用于此目的的结构? (哪一个用于简化在现有元素之间插入另一个元素,以及按其属性对元素进行排序)
我知道互联网上有大量的Java资源,但我想知道有这种问题的人的意见。
答案 0 :(得分:2)
有完整的书籍专门讨论你的问题(数据结构),但我会尽量保持简单。有许多选项,如堆排序,qucksort,合并排序,二叉树等......但是我建议使用简单的内置功能,而不是学习这些方法。
<强> Arrays.sort(PA)强>;使用它们的自然顺序将基本类型数组的元素按升序排序。
Arrays.sort(pa,from,to); 对基本类型的元素pa [from] ... pa [to-1]进行排序。按升序排列。
Arrays.sort(oa); 使用Comparable接口定义的顺序,按升序对对象类型数组的元素进行排序,该接口定义compareTo方法。请注意许多Java类,如String(但不是StringBuffer),Double, BigInteger等实现了Comparable。
Arrays.sort(oa,from,to); 对数组的元素进行排序,范围从...到对象类型的升序。
Arrays.sort(oa,comp);使用Comparator comp。
对对象类型数组的元素按升序排序Arrays.sort(oa,from,to,comp); 使用Comparator comp对数组的元素进行排序,范围从...到对象类型的升序。
import java.util.Arrays;
public class Dblsrt {
//========================================================= main
public static void main(String[] args) {
//... 1. Sort strings - or any other Comparable objects.
String[] names = {"Zoe", "Alison", "David"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
//... 2. Sort doubles or other primitives.
double[] lengths = {120.0, 0.5, 0.0, 999.0, 77.3};
Arrays.sort(lengths);
System.out.println(Arrays.toString(lengths));
}
}
输出:
[Alison, David, Zoe]
[0.0, 0.5, 77.3, 120.0, 999.0]
赞美,http://www.leepoint.net/notes-java/data/arrays/70sorting.html
答案 1 :(得分:2)
这取决于您的表现需求。
为了您的使用,您可以使用SortedSet
实施TreeSet,并为您的Point类(或现有的Comparator类)编写Point2D根据元素x值。这将允许您在O(log(n))
中插入和检索元素。
请注意,如果您进行大量插入操作,则不应使用Array
,因为Array
中间的n个插入费用为n^2
。但是,如果您遍历数据的次数远远超过更新数据,那么Array
就可以了。