【问题标题】:Large data set sorting problems大数据集排序问题
【发布时间】:2011-04-26 00:39:33
【问题描述】:

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

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

【问题讨论】:

  • 你的比较功能是假的。
  • 使用静态方法 Double.compare(a, b),这将简化编写您自己版本的比较方法。
  • 您能解释一下您的意思吗:“我想对从左上角开始并沿平行对角线移动直到右下角的点进行排序。”?
  • @Mr E 很抱歉导致图片和 mediafire 链接不好,但我想不出其他解释。我正在尝试这样排序:mediafire.com/i/?g6w20shw99gox0b
  • @PEdroArthur 我应该做些什么来减少它的虚假?

标签: java arrays sorting mergesort


【解决方案1】:

看你链接的图片,我想你想在左上角点的L1 distance上做Double.compare()

这意味着,给定二维点 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() 的合理比较器中。

更新:在您上次发表评论后,我现在了解额外的排序标准。在比较双打时,您可能需要考虑精度 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);

【讨论】:

  • 这是我已经在这些行中写的: if(a1[0]+a1[1] > a2[0]+a2[1]) return 1;否则 if(a1[0]+a1[1] 符号不是比较它们吗?
  • 1.您需要对绝对值求和。您没有这样做 2. 假设这是固定的,您的代码仅在框的左上角位于 (0,0) 时才有效
  • 左上角始终为 0,0,所以这不是问题。似乎它正确地根据 L1 距离对所有内容进行排序,而不是按 x 降序排列,其中点具有相同的 L1 距离。例如,排序列表中的点按以下顺序排列: (0.7 0.6) (0.6 0.7) (1.3 0.0) (1.2 0.1) (1.1 0.2) (1.0 0.3) (0.9 0.4) (0.8 0.5) (0.5 0.8) (0.4 0.9) (0.3 1.0) (0.2 1.1) (0.1 1.2) (0.0 1.3)
  • 非常感谢!你是对的,在比较双精度值时这是一个精度问题。非常感谢您的帮助。
猜你喜欢
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
相关资源
最近更新 更多