假设我有两个ArrayLists:
name: [Four, Three, One, Two]
num: [4, 3, 1, 2]
如果我这样做:Arrays.sort(num),那么我有:
name: [Four, Three, One, Two]
num: [1, 2, 3, 4]
有没有办法可以对num进行排序并将其反映在名称中,以便最终得到:
name: [One, Two, Three, Four]
num: [1, 2, 3, 4]
?请帮帮我。我想到了比较器和对象,但根本不知道它们。
答案 0 :(得分:9)
您应该以某种方式将 name
和num
字段关联到一个类中,然后列出该特定类的实例。在此类中,提供检查数值的compareTo()
方法。如果对实例进行排序,那么名称字段也将按您所希望的顺序排列。
class Entity implements Comparable<Entity> {
String name;
int num;
Entity(String name, int num) {
this.name = name;
this.num = num;
}
@Override
public int compareTo(Entity o) {
if (this.num > o.num)
return 1;
else if (this.num < o.num)
return -1;
return 0;
}
}
测试代码可能是这样的:
public static void main(String[] args) {
List<Entity> entities = new ArrayList<Entity>();
entities.add(new Entity("One", 1));
entities.add(new Entity("Two", 2));
entities.add(new Entity("Three", 3));
entities.add(new Entity("Four", 4));
Collections.sort(entities);
for (Entity entity : entities)
System.out.print(entity.num + " => " + entity.name + " ");
}
输出:
1 =&gt;一个2 =&gt;两个3 =&gt;三个4 =&gt;四
答案 1 :(得分:2)
您可以拥有一个只有索引的数组
,而不是对实际数组进行排序a[i] = i for i = 0..n
您可以使用自定义比较器根据numeruc数组对此数组进行排序。 e.g。
bool compare( int a, int b ) { return num[a] < num[b]; }
因此,您可以使用这些索引对这两个数组进行排序。
答案 2 :(得分:2)
如果您没有重复的元素,那么您可以使用类似TreeMap的排序地图:
int[] num = {4, 3, 1, 2};
String[] name = {"Four", "Three", "One", "Two"};
TreeMap<Integer,String> sortedMap = new TreeMap<Integer,String>();
for (int i=0; i<num.length; i++) sortedMap.put(num[i], name[i]);
// Resulting sortedMap: {1=One, 2=Two, 3=Three, 4=Four}
如果你确实有重复的元素,那么这将不起作用,因为地图的键必须是唯一的。
答案 3 :(得分:0)
在某些情况下,创建一个新类只是为了根据给定列表进行多种排序没有多大意义。我创建了一个执行此操作的函数,但我已将代码发布在another SO post中,因此我不会重复它。以下是如何使用它的示例。
以下是如何使用该函数对任意类型的多个列表进行排序的示例:
// The key can be any type that implements Comparable, Dupes are allowed
List<Integer> key = Arrays.asList(4, 3, 1, 2, 1);
// List Types do not need to be the same
List<String> list1 = Arrays.asList("Four", "Three", "One", "Two", "One");
List<Character> list2 = Arrays.asList('d', 'c', 'a', 'b', 'a');
// Sorts key, list1, list2 using key as the sorting key.
keySort(key, key, list1, list2);
输出
key: [1, 1, 2, 3, 4]
list1: [One, One, Two, Three, Four]
list2: [a, a, b, c, d]