我有一个2-D数组,表示构成矩形的点网格的x和y坐标。使用的数据集通常非常大。我想从左上角开始对点进行排序,并在平行的对角线上移动直到右下角。我正在使用Arrays.sort函数和以下比较器来执行此操作:
public int compare(Object o1, Object o2) {
double[] a1 = (double[])o1;
double[] a2 = (double[])o2;
if (a1[0]+a1[1] > a2[0]+a2[1]) return 1;
else if (a1[0]+a1[1] < a2[0]+a2[1]) return -1;
else {
if (a1[0] > a2[0]) return 1;
else if (a1[0] < a2[0]) return -1;
else return 0;
}
}
当每个点的x和y坐标间隔两位数时,代码的工作原因是某些原因,但如果它们间隔一个数字,则排序中存在错误。
原始订单的示例可在此处找到: http://www.mediafire.com/?slq73v3zn2zs98l
可以在此处找到生成的排序列表的示例: http://www.mediafire.com/?x8f08q0qoof398w
为什么排序不起作用?任何帮助都会非常感激!
答案 0 :(得分:0)
查看您关联的图片,我想您想在左上角点L1 distance处Double.compare()
进行操作。
这意味着,您需要比较2d积分a
和b
以及“origin”Origin
(在这种情况下是左上角点):
distance_a = Math.abs(Origin.x - a.x) + Math.abs(Origin.y - a.y)
distance_b = Math.abs(Origin.x - b.x) + Math.abs(Origin.y - b.y)
return Double.compare(distance_a,distance_b);
并通过比较这些距离进行排序。你可以把它包装成一个使用Double.compare()
的合理比较器。
更新:在您上次评论后,我现在了解额外的排序标准。在比较双打时,你可能需要考虑精度issues(其他人可以更好地建议你),但你想要的东西大致如下:
distance_a = Math.abs(Origin.x - a.x) + Math.abs(Origin.y - a.y)
distance_b = Math.abs(Origin.x - b.x) + Math.abs(Origin.y - b.y)
if distance_a is not equal to distance_b // check how you should perform the comparison
return Double.compare(distance_a,distance_b);
else
return Double.compare(a.x,b.x);