0

次のようなオブジェクトを含む2つの配列リストがあります。

最初の配列リストには文字列とdoubleが含まれています:[a 1.1、b 1.2、d 0.4、g 1.9、f0.5など...]

2番目のarraylistには、string、double、およびintが含まれます:[b 0.1 2、f 1.1 5、g 2.3 1、1.12など...]

2番目のarraylistには、1番目の配列と同じか、それより多いか少ない数の項目が含まれている可能性がありますが、そのすべての文字列プロパティ値は、1番目の文字列プロパティにのみ存在する値のいずれかになります。

2番目のarraylistを、1番目のarraylist文字列プロパティの順序に従ってstringプロパティで並べ替える必要があります。最初の配列リストはすでに順番に並んでおり、2番目の配列リストを並べ替えると、期待される出力は次のようになります。

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

コンパレータでいくつかの質問と回答を見てきましたが、それらはすべて1つのタイプの配列リストでソートを行っています。しかし、ここには2種類の配列リストがあり、その方法が本当にわかりません。

ですから、何かアイデアがあれば私と共有してください。可能であれば、サンプルコードを共有してください。

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

次に、マップを使用して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);
于 2012-06-06T17:53:18.277 に答える
0

これはかなり複雑な問題であり、真に単純な解決策はありません。

私が考えることができる最も簡単なことは、サードパーティのライブラリGuavaに依存します。(開示:私は寄稿者です。)

まだ名前を付けていないので、最初のオブジェクトタイプFooと2番目のオブジェクトタイプを呼び出しましょう。また、 sのフィールドは2番目のリストで一意Barであると想定しています。StringBar

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

のオブジェクトがFoo型とBar型であり、どちらも文字列プロパティを返すメソッドを実装しているlist1と仮定します。あなたが言ったように、リスト1の文字列値は一意です。list2getString()

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 に答える