我有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但是无法获得任何有用的想法。我已经解释了上面的情况,如果我犯了任何错误,请原谅我!
谢谢!
答案 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)
让我们假设list1
和list2
中的对象属于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());
}
});