セットを使用してのArrayListから重複リストを削除

ZAK ZAK:

私は重複のArrayListが含まれているリストを持っています。

私はそれらを除去するための解決策を探しています。

次に例を示します。

listOne = [[1, 0], [0, 1], [3, 2], [2, 3]]

このセットは、重複したリストが含まれています。通常、私は取得したいです:

theListAfterTransformation  = [[1, 0],[3, 2]]

ここに私の小さな例があり、私はセットを使用しようとしましたが、それはうまくいきませんでした。

public class Example {
    public static void main( String[] args ) {
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();

        ArrayList<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(0);
        ArrayList<Integer> list2 = new ArrayList<>(); list2.add(0); list2.add(1);
        ArrayList<Integer> list3 = new ArrayList<>(); list3.add(3); list3.add(2);
        ArrayList<Integer> list4 = new ArrayList<>(); list4.add(2); list4.add(3);

        lists.add(list1);lists.add(list2);lists.add(list3);lists.add(list4);

        System.out.println(getUnduplicateList(lists));


    }
    public static ArrayList<ArrayList<Integer>> getUnduplicateList( ArrayList<ArrayList<Integer>> lists) {
        Iterator iterator = lists.iterator();
        Set<ArrayList<Integer>> set = new HashSet<>();
        while (iterator.hasNext()){
            ArrayList<Integer> list = (ArrayList<Integer>) iterator.next();
            set.add(list);
        }
        return new ArrayList<>(set);
    }

}

私のプロジェクトから小さな一例であり、この実装に変更多くの事、そのソリューションを使用することは非常に困難になります注意してください。

だから、getUnduplicateListは同じシグネチャを維持する必要があることを考慮に入れます。良いアイデアは、実装を変更することになります。

このプログラムは、入力と同じリストを印刷します。どんな考えください。

nbrooks:

terminology-上のカップルのノートSetは異なるデータ構造であり、List前者は順不同であり、後者は一般的に注文して、重複を可能にするの基本的な、線形コレクションですが、重複を許可していません。あなたが抱えている問題の一部とすることができる、同義的に用語を使用しているように見える。Setここはおそらく適切なデータ構造です。

それはあなたのコードがに頼っているようだ、とList私たちは一緒にそれに従うことができるように、API。なお、ごべき、一般的には、コードへのインタフェースListむしろ特定のクラスより)、( ArrayList)。

また、使用することを検討Arrays.asListリスト(これは返すことに注意してください初期化するための速記法を不変のリストを)。

最後に、ノートそのHashSet両方のオブジェクトが同じを持っているかどうかをチェックすることによって排除する重複hashCode要素はで表示されない限り、同一の要素を含むリストは依然として同じリストであると見なされていないのと同じ順序、及び典型的には重複として扱われません。セットは、しかし、実装equalshashCode全く同じ要素を含む2組(順番は問わない)に等しいと考えられるようです。


あなたの最初の出発のコレクションを使用して、セットに、各内側のリストを変換することができます。次に、外側のコレクションから重複を排除します。最後に、(必要に応じて)あなたのコードの残りの部分との互換性を維持するために、バックリストにインナーコレクションを変換します。このアプローチは、内部リストのサイズに関係なく動作します。

あなたは使用してこれらの手順をシミュレートすることができStream、およびにしてから変換するために、メソッド参照を使用してSet以下のように、。


import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;

public class Example {

    public static void main( String[] args ) {
        List<Integer> list1 = Arrays.asList(1, 0);
        List<Integer> list2 = Arrays.asList(0, 1);
        List<Integer> list3 = Arrays.asList(3, 2);
        List<Integer> list4 = Arrays.asList(2, 3);

        List<List<Integer>> lists = Arrays.asList(list1, list2, list3, list4);

        System.out.println(getUnduplicateList(lists));
    }

    public static List<List<Integer>> getUnduplicateList(List<List<Integer>> lists) {
        return lists
                .stream()
                .map(HashSet::new)
                .distinct()
                .map(ArrayList::new)
                .collect(Collectors.toList());
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=183627&siteId=1