使用Java中具有相同类型属性的另一个arraylist的顺序,通过对象属性对arraylist进行排序

时间:2012-06-06 16:44:40

标签: java sorting collections arraylist

我有2个arraylists包含这样的对象:

第一个arraylist包含string和double:[a 1.1,b 1.2,d 0.4,g 1.9,f 0.5等等......]

第二个arraylist包含string,double和int:[b 0.1 2,f 1.1 5,g 2.3 1,a 1.1 2等等......]

第二个arraylist可能包含相同或更多或更少数量的项目,但它的所有字符串属性值都只是第一个字符串属性中的任何一个。

我需要根据第一个arraylist字符串属性的顺序,通过string属性对第二个arraylist进行排序。第一个arraylist已经按顺序排列,如果我排序第二个,那么预期的输出将是:

[a 1.1 2,b 0.1 2,g 2.3 1,f 1.1 5 .....]

我已经看到了比较器的一些问题和答案,但他们所有人都在使用一种类型的arraylist。但在这里我有两种类型的arraylist,我真的不知道该怎么做!

因此,如果您有任何想法,请与我分享,如果可能的话,请分享一些示例代码。

我是stackoverflow的新手,也没有多少Java经验。我遇到这种情况很麻烦。谷歌搜索和搜索特别是在stackoverflow但是无法获得任何有用的想法。我已经解释了上面的情况,如果我犯了任何错误,请原谅我!

谢谢!

3 个答案:

答案 0 :(得分:1)

这很简单。这里有一些伪Java,假设list1中没有重复的密钥,并且不需要任何外部库。

假设以下......

class List1Item {
    String stringValue;
    double doubleValue;
};
class List2Item {
    String stringValue;
    double doubleValue;
    int    intValue;
};

List<List1Item> list1 = new ArrayList<>();
List<List2Item> list2 = new ArrayList<>();

一般方法是在第一个列表中构建每个键值与其位置之间的映射。

// Map to hold list1 key-to-position association
Map<String,Integer> sortKeys = new HashMap<>();

// Populate the key-to-position map with keys from list1
int pos=0;
for (List1Item i : list1)
    sortKeys.put(i.stringValue,pos++);

然后使用地图按list2中的键位置对list1项目进行排序:

// Define a comparator that will use the map to sort list2 keys
Comparator<List2Item> comp = new Comparator<List2Item>() 
{
    public int compare(List2Item v1, List2Item v2)
    {
        return sortKeys.get(v1.stringValue).compareTo(sortKeys.get(v2.stringValue));
    }
}
Collections.sort(list2,comp);

答案 1 :(得分:0)

这是一个非常复杂的问题,并没有任何真正简单的解决方案。

我能想到的最简单的事情取决于第三方库Guava。 (披露:我是撰稿人。)

让我们调用第一个对象类型Foo和第二个对象类型Bar,因为您尚未命名它们。我还假设第二个列表中String的{​​{1}}字段唯一

Bar

答案 2 :(得分:0)

让我们假设list1list2中的对象属于Foo和Bar类型,它们都实现了一个返回字符串属性的方法getString()。就像你说的,列表1中的字符串值是唯一的。

ArrayList<Foo> list1 = new ArrayList<Foo>();
ArrayList<Bar> list2 = new ArrayList<Bar>();

final HashMap<String, Integer> positions = new HashMap<String, Integer>();
for(int i=0;i<list1.size();i++){
    positions.put(obj.getString(), i);
}

Collections.sort(list2, new Comparator<Bar>(){
    public int compare(Bar obj1, Bar obj2){
        return positions.get(obj2.getString()) - positions.get(obj1.getString());
    }
});