2017-07-13 10 views
1

これを行うためのJavaライブラリ関数はおそらく、おそらくStackOverflowの別の質問ですが、予備検索では何も見つかりませんでした。Java List自分自身を変更する別のリストを参照する

私は2つのjava.util.Listオブジェクト、ListAおよびListBを持っています。 ListAの要素を変更するにはListAより大きいListBを使用します。これを行うには、ListAのIDをListBの対応する要素に一致させる必要があります(これまでのコードでは、ListAの各要素はListBになります)のフィールドを使用してListAを変更してください。

これを行うにはハッシュ関数が最適ですか?それとも良い方法がありますか?

EDIT:二つのリストは、あなたの最善の策かもしれないHashSetを使用してオブジェクト

+0

リストに同じ種類のオブジェクトが含まれている場合は、そのオブジェクトに対して 'id'フィールドを使用して' hashCode'と 'equals'を実装することができます。 'indexOf'を使ってリスト内のオブジェクトを探します。 – tima

+4

IDが<->のマップは行き先です。 ListBをマップに変換します。 IDを使用して対応するオブジェクトを取得してListAを変更することができます – KarelG

答えて

2

おそらく、そのIDに対応ListBから要素にID属性をマッピングし、ListBからMapを作成する必要があります。たとえListBがリストであったとしても、の全体をListAに検索するよりも速くそれをMapに変換する方が速いでしょう。

Aに対応するBを取得し、それに応じてAを修正することができます。ここでは簡単な例を示します。

class A { int id; String foo; } 
class B { int id; String bar; } 

List<A> listA = ... 
List<B> listB = ... 
Map<Integer, B> mapB = listB.stream().collect(Collectors.toMap(b -> b.id, b -> b)); 
for (A a : listA) { 
    B b = mapB.get(a.id); 
    a.foo = b.bar; 
} 
+0

私はこのようなことをしましたが、MultiMapを代わりに使用し、forループを設定しました。私は一般的にこれは最高の答えだと思う。 – littlespice3

0

の同じ種類を持っていません。 HashSetに新しい要素を追加すると、ハッシュアルゴリズムがすべての固有要素にキーを与えます。 IDを確認する場合は、Hashキーがあなたの答えかもしれません。また、あなたが望むならば、HashSetListAからListBにすべての要素を追加するように、保証が古くなるかもしれないあなたの以前のコード。より具体的な助言をしたいと思いますが、あなたの質問は非常に曖昧です。

0

答えは以下のとおりです。

使用する最適なデータ構造は、正確な要件によって異なります。 メイン(ほとんどの場合)ユースケースは、リストAのエントリに基づいてリストBからオブジェクトをフェッチする場合、自然選択はMap<ID, ListBEntry>となります。これは、あなたが実際にリストBを最後に持っていないことを意味する可能性があります。ちょうどその地図。

しかし、他の使用パターンの場合は、マップとその両方のリストを保持する必要があります。

それとも、あなたの制約がメモリ(ないCPUサイクル/パフォーマンス)であれば、あなたも、ちょうど2つのリストと値を毎回マッチングするため検索リストに行くかもしれません。

0

私はtobias_k's answerが間違いないと思います。

Map<ID, B> map = new HashMap<>(); 
listB.forEach(b -> map.put(b.getID(), b)); 

listA.replaceAll(a -> { 
    B b = map.get(a.getID()); 
    // modify a with b here 
    return a; 
}); 
関連する問題