在 Java 中对匹配的数组进行排序

2022-09-01 20:27:08

假设我有两个数组(在Java中),

整数;和 int[] 颜色;

数字的每个 i 元素都对应于其颜色的第 i 个元素。例如,数字 = {4,2,1} 颜色 = {0x11, 0x24, 0x01};表示数字 4 是颜色0x11,数字 2 是0x24,依此类推。

我想对数字数组进行排序,但仍然有它,以便每个元素都与其颜色对匹配。

例如数字 = {1,2,4};颜色 = {0x01,0x24,0x11};

最干净,最简单的方法是什么?数组有几千个项目,因此最好就位,但不是必需的。做一个Arrays.sort()和一个自定义比较器有意义吗?最好尽可能多地使用库函数。

注意:我知道“最佳”解决方案是为这两个元素创建一个类,并使用自定义比较器。这个问题旨在向人们询问编写此代码的最快方法。想象一下,在编程竞赛中,你不会想做所有这些额外的类,比较器的匿名类,等等。更好的是,忘记Java;你会如何用C语言编写代码?


答案 1

您可以将 sort() 与自定义比较器一起使用,前提是您保留了第三个带有索引的数组,并按该数组进行排序,从而使数据保持不变。

Java 代码示例:

Integer[] idx = new Integer[numbers.length];
for( int i = 0 ; i < idx.length; i++ ) idx[i] = i;              
Arrays.sort(idx, new Comparator<Integer>() {
    public int compare(Integer i1, Integer i2) {                        
        return Double.compare(numbers[i1], numbers[i2]);
    }                   
});

// numbers[idx[i]] is the sorted number at index i
// colors[idx[i]] is the sorted color at index i

请注意,您必须使用而不是自定义比较器,或者不能使用自定义比较器。Integerint


答案 2

似乎最干净的做法是创建一个实现Compeable的自定义属性类。例如:

class Color implements Comparable {
  private int number;
  private int color;

  // (snip ctor, setters, etc.)

  public int getNumber() {
    return number;
  }
  public int getColor() {
    return color;
  }

  public int compareTo(Color other) {
    if (this.getNumber() == other.getNumber) {
      return 0;
    } else if (this.getNumber() > other.getNumber) {
      return 1;
    } else {
      return -1;
    }
  }
}

然后,您可以将排序算法与排序逻辑分开(如果您使用 List 而不是数组,则可以使用 Collections.sort),最重要的是,您不必担心以某种方式使两个数组不同步。


推荐