如何将一个数组操作“复制”到另一个数组?

6
这可能是一个简单的问题,但我有两个数组,每个数组大约有1000个元素,它们被称为posXArrayposYArray。 我想按数字顺序(从最小到最大)对posYArray进行排序,但我希望将同样的操作应用于posXArray的元素...

例如,如果posYArray的第[56]个元素是最小的,我希望posXArray的第[56]个元素也移动到[0]。

在Java中如何轻松/有效地实现这一点?

非常感谢你的帮助!
4个回答

8

由于数组中似乎包含X和Y坐标,因此更好的选择是创建一个包含这两个值的坐标类,并实现Comparable接口,然后使用内置算法对单个数组进行排序。


2
创建一个类,例如:
public class XYPos implements Comparable<XYPos> {
    int x;
    int y;

    @Override
    public int compareTo(XYPos o) {
        int res = this.y - o.y;
        if(res == 0) {
            res = this.x - o.x;
        }
        return res;
    }
}

然后:

  1. 将您的2个数组转换为一个XYPos数组
  2. 对其进行排序
  3. 使用排序后数组中的值更新您的2个原始数组

1
创建一个长度相同的Integer[] idx,并用数字0到999(或其他数字)填充它,然后使用一个比较器对该数组进行排序。
public int compare(Integer a, Integer b) {
  return posYArray[a] - posYArray[b];
}

这将为您提供其他数组的索引数组,即最小的Y值将是posYArray[idx[0]],相应的X将是posXArray[idx[0]]等等。如果您不想维护间接性,可以通过idx值重新排序原始数组。

如果您经常进行此类操作,则可能希望查看fastutil,它提供直接操作基本类型(例如int)的集合和比较器类型,避免了装箱和拆箱整数的需要。


0
您可以实现任何您选择的排序算法,在第一个数组(posXArray)上进行比较检查,然后同时交换两个数组中的元素位置。

这确实是一个可能性,也可以实现 - 简单易行:我认为是这样,好的:同意,事实上它不是(其实我投票支持创建一个类的答案之一) :) - Grim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接