如何以相同的顺序对2个不同类型数据的ArrayLists进行排序?

时间:2012-01-03 22:23:20

标签: java

假设我有一个String的ArrayList和一个int的ArrayList。

我的字符串列表包含:

index : value
-----------------
0     : "Paul"
1     : "Peter"
2     : "Maria"

My ArrayList of Integers contians:

index : value
-----------------
0     : 2
1     : 0
2     : 1

假设我使用

对我的int数组进行排序
Collections.sort(myArrayOfint);

结果在索引0处应为0,在索引1处应为1,在索引2处为2对吗?

我想要做的是考虑我的int数组的新顺序对我的String数组进行排序,例如“Paul”将转到索引1,“Peter”转到索引2,“Maria”转到索引0。 order将与我的int数组交换相同。

我怎么能这样做,有可能吗?

3 个答案:

答案 0 :(得分:4)

您可以使用属性创建类,并使用基于不同属性进行比较的不同Comparator

public class Person {
    private String name;
    private Integer id;

    //getter/setter
}

List<Person> people = new ArrayList<Person>();

Collections.sort(people, new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
});


Collections.sort(people, new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getId().compareTo(p2.getId());
    }
});

答案 1 :(得分:3)

我的感觉是你有一个int数组和一个字符串数组,但是你应该有一个Person个对象数组,Person有一个类型为ID的字段int以及name类型的字段String。按ID对您的人员进行排序,名称和ID当然会按相同的顺序排序。

使用对象。这就是OOP的全部意义。

答案 2 :(得分:1)

您不应该对myArrayOfint进行排序:它根据您对字符串数组进行排序来定义排列。最简单的方法是使用临时数组,如下所示:

String tmp[] = new String[myArrayOfint.length];
for (int i = 0 ; i != myArrayOfint.length ; i++) {
    tmp[i] = myArrayOfStrings[myArrayOfint[i]];
}
myArrayOfStrings = tmp;

这很有效,因为

myArrayOfStrings[myArrayOfint[0]] = myArrayOfStrings[2] = "Maria"
myArrayOfStrings[myArrayOfint[1]] = myArrayOfStrings[0] = "Paul"
myArrayOfStrings[myArrayOfint[2]] = myArrayOfStrings[1] = "Peter"

这个问题也可以在没有临时数组的情况下解决,但算法更复杂。