0

我有一个二维数组,表示构成矩形的点网格的 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

为什么排序不起作用?非常感谢任何帮助!

4

1 回答 1

0

看着你链接到的图片,我想你想做点到左上角Double.compare()L1 距离。

这意味着,给定 2d 点ab,以及您要比较的“原点” 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().

更新:在您上次发表评论后,我现在了解额外的排序标准。在比较双打时,您可能需要考虑精度问题(其他人可以为您提供更好的建议),但是您想要大致如下:

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);
于 2011-04-26T01:12:01.493 回答