1

私はこの形式のオブジェクトのリストを持っています:

class myObj {

    private String identifier;

    public myObj(String identifier){
        this.identifier = identifier;
    }

}

List<myObj> allobjects = new ArrayList<myObj>();
allobjects.add(new myObj("123"));
allobjects.add(new myObj("123"));
allobjects.add(new myObj("123"));
allobjects.add(new myObj("123"));
allobjects.add(new myObj("1234"));
allobjects.add(new myObj("12345"));
allobjects.add(new myObj("12"));
allobjects.add(new myObj("12"));

重複するオブジェクトを個別のリストに抽出するエレガントな方法は何ですか?したがって、上記の例では、2つのリストを含む新しいリストが返されます。最初のリストには以下が含まれます:

new myObj("123");
new myObj("123");
new myObj("123");
new myObj("123"); 

2番目のリストには次のものが含まれます。

new myObj("12");
new myObj("12");

考えられる解決策は、新しいオブジェクトを作成することです。

List<List<myObj>> newList = new ArrayList<List<myObj>>

次に、リスト内の要素ごとに「allobjects」が各要素を繰り返し処理し、複数回含まれている要素ごとにリストに追加します。次に、現在の要素の反復の最後に、新しく作成されたリストを「newList」に追加します。

これは受け入れられますか、それとも別の解決策がありますか?

4

2 に答える 2

2

equalsメソッドとhashCodeメソッドをmyObjクラスに追加して、それらをMapキーとして使用できるようにします。

class myObj {

    private String identifier;

    public myObj(String identifier){
        this.identifier = identifier;
    }

    public int hashCode(){
        return identifier.hashCode();
    }

    public boolean equals(Object o){
        return identifier.equals(((myObj)o).identifier);
    }
}

次に、マップを宣言します。

Map<myObj, List<myObj>> map = new HashMap<myObj, List<MyObj>>()

元のリストを繰り返し処理します。myObjsをマップキーとして使用し、そのmyObjに対応するリストを毎回取得します。特定のmyObjに初めて遭遇した場合は、リストを作成することを忘れないでください。

for(myObj obj : allobjects){
    List<myObj> list = map.get(obj);
    if(list == null){
        list = new ArrayList<myObj>();
        map.put(obj, list);
    }
    list.add(obj);
}
于 2012-12-05T14:10:07.427 に答える
1

必要に応じてequalsを実装すると、containsを使用して、他のコレクションをチェックすることで反復処理できます。

jdk8sのラムダでそれを行う方法は次のとおりです。

TransformService transformService = (inputs1, inputs2) -> {
            Collection<String> results = new ArrayList<>();
            for (String str : inputs1) {
                if (inputs2.contains(str)) {
                    results.add(str);
                }
            }
            return results;
        };
        Collection<String> inputs1 = new ArrayList<String>(2) {{
            add("lemon");
            add("cheese");
            add("orange");
        }};
        Collection<String> inputs2 = new
                ArrayList<String>(2) {{
                    add("apple");
                    add("random");
                    add("cheese");
                }};
        Collection<String> results = transformService.transform(inputs1, inputs2);
        for (String result : results) {
            System.out.println(result);
        }
    }

    public interface TransformService {
        Collection<String> transform(Collection<String> inputs1, Collection<String> inputs2);
    }
于 2012-12-05T14:02:22.317 に答える