0

我有 2 个数组列表包含这样的对象:

第一个数组列表包含字符串和双精度:[a 1.1, b 1.2, d 0.4, g 1.9, f 0.5 等等...]

第二个数组列表包含字符串、双精度和整数:[b 0.1 2, f 1.1 5, g 2.3 1, a 1.1 2 等等...]

第二个数组列表可能包含与第一个相同或更多或更少的项目,但其所有字符串属性值将是仅存在于第一个字符串属性中的任何值。

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

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

我已经看到了一些关于比较器的问题和答案,但他们都在使用一种类型的数组列表进行排序。但是在这里我有两种类型的arraylist,我真的不知道该怎么做!

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

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

谢谢!

4

3 回答 3

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++);

然后使用 maplist2按 in 键的位置对项目进行排序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);
于 2012-06-06T17:53:18.277 回答
0

这是一个相当复杂的问题,不会有任何真正简单的解决方案。

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

让我们调用第一个对象类型Foo和第二个对象类型Bar,因为您还没有命名它们。我还假设s的String字段在第二个列表中是唯一的。Bar

List<String> stringOrder = new ArrayList<String>();
for (Bar bar : list2) {
  stringOrder.add(bar.getString());
}
Ordering<String> stringComparator = Ordering.explicit(stringOrder);
// construct a String comparator based on that ordering
Ordering<Foo> fooOrdering = stringComparator.onResultOf(
  new Function<Foo, String>() {
    public String apply(Foo foo) {
      return foo.getString();
    }
  });
Collections.sort(list1, fooOrdering);
于 2012-06-06T16:57:09.657 回答
0

让我们假设对象 inlist1list2是 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());
    }
});
于 2012-06-06T17:54:11.487 回答