假设我有两个数组(在Java中),
int []数字; 和int []颜色;
数字的每个第i个元素对应于颜色中的第i个元素.例如,数字= {4,2,1}颜色= {0x11,0x24,0x01}; 意味着数字4是颜色0x11,数字2是0x24等.
我想对数字数组进行排序,但是仍然有它,所以每个元素都与颜色对匹配.
防爆.数字= {1,2,4}; colors = {0x01,0x24,0x11};
什么是最干净,最简单的方法?阵列有几千个项目,因此到位是最好的,但不是必需的.做一个Arrays.sort()和自定义比较器是否有意义?最好使用库函数.
注意:我知道"最佳"解决方案是为两个元素创建一个类并使用自定义比较器.这个问题的目的是要求人们以最快的方式对此进行编码.想象一下,参加一个编程竞赛,你不会想要制作所有这些额外的类,比较器的匿名类等.更好的是,忘记Java; 你会如何在C中编码?
如果保留带索引的第三个数组,则可以将sort()与自定义比较器一起使用,并对其进行排序,保持数据不变.
Java代码示例:
Integer[] idx = new Integer[numbers.length]; for( int i = 0 ; i < idx.length; i++ ) idx[i] = i; Arrays.sort(idx, new Comparator() { 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
请注意,您必须使用Integer
而不是int
或不能使用自定义比较器.
好像做的是创建一个实现可比的自定义属性类最干净的东西.例如:
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; } } }
然后,你可以分开你从排序逻辑排序算法(如果你使用一个列表,而不是一个数组,你可以使用Collections.sort),以及最重要的是,你将不必担心在某种程度上获得两个阵列不同步.