5

配列リストを開発しました。

ArrayList<String> list = new ArrayList<String>();

list.add("1");
list.add("2");
list.add("3");
list.add("3");
list.add("5");
list.add("6");
list.add("7");
list.add("7");
list.add("1");
list.add("10");
list.add("2");
list.add("12");

しかし、上記のように、多くの重複要素が含まれています。そのリストからすべての重複を削除したい。このためには、まずリストをセットに変換する必要があると思います。

Java はリストをセットに変換する機能を提供しますか? リストから重複を削除する他の機能はありますか?

4

8 に答える 8

25

次のコマンドでセットに変換できます。

Set<String> aSet = new HashSet<String>(list);

または、次の方法でセットに変換してリストに戻すこともできます。

list = new ArrayList<String>(new HashSet<String>(list));

ただし、これらの両方が要素の順序を保持する可能性はありません。HashSet順序を維持するために、反復中に補助構造としてaを使用できます。

List<String> list2 = new ArrayList<String>();
HashSet<String> lookup = new HashSet<String>();
for (String item : list) {
    if (lookup.add(item)) {
        // Set.add returns false if item is already in the set
        list2.add(item);
    }
}
list = list2;

重複の場合、最初のオカレンスのみが結果に表示されます。最後のオカレンスだけを表示したい場合、それはより難しい問題です。入力リストを逆にして、上記を適用してから、結果を逆にすることで対処します。

于 2012-04-29T08:31:01.440 に答える
9

これ:

Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);
于 2012-04-29T08:27:49.093 に答える
3

要素の順序を保持する必要がある場合は、HashSet の代わりに LinkedHashSet を使用してください

Set<String> mySet = new LinkedHashSet<String>(list);
于 2014-06-06T20:18:52.110 に答える
1

通常のコンストラクターを使用するだけです。

ArrayList<T> yourList;
HashSet<T> set = new HashSet<T>(yourList);

また、重複が削除されたアイテムの新しいビューが表示されますが、注文は失われます。これは、これまでに投稿されたすべての回答に当てはまります。順序を維持するには、既存のリストを繰り返し処理し、要素が重複している場合にのみ要素を削除する必要があります(これは、要素が既に見つかっているかどうかを確認するためのセットを使用して実行できます)。

于 2012-04-29T08:31:33.117 に答える
0

そもそもセットを使用するか、セットに変換することができます。

 Set<String> set = new TreeSet<String>(list);
于 2012-04-29T08:30:53.937 に答える
0

これを実現する方法をいくつか紹介します。

Java 8 の使用:

List<String> distinctLambda=originalList.stream()
           .distinct().collect(Collectors.toList());
 System.out.println(distinctLambda);

セットの使用:

Set<String> distinctSet=new HashSet<>(originalList);
        System.out.println(distinctSet);

通常の for ループ:

List<String> distinctNewList=new ArrayList<>();
        for (String temp:originalList) {
            if(distinctNewList.size()==0){
                distinctNewList.add(temp);
                continue;
            }

            if(!distinctNewList.contains(temp)){
                distinctNewList.add(temp);
            }
        }

        System.out.println(distinctNewList);

これがあなたのデータセットです:

ArrayList<String> originalList = new ArrayList<>();
        originalList.add("1");
        originalList.add("2");
        originalList.add("3");
        originalList.add("3");
        originalList.add("5");
        originalList.add("6");
        originalList.add("7");
        originalList.add("7");
        originalList.add("1");
        originalList.add("10");
        originalList.add("2");
        originalList.add("12");
于 2019-03-28T05:05:44.933 に答える
0
package com.scjp.dump.test;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class ArrayListTest {

    public static void main(String[] args) {

        List<Integer> mylist2 = new ArrayList<Integer>();

        List<Integer> mylist1 = new ArrayList<Integer>();
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(5);
        mylist1.add(9);
        mylist1.add(2);
        mylist1.add(5);
        mylist1.add(5);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(9);
        mylist1.add(56);
        System.out.println(mylist1);
        Iterator<Integer> itr1 = mylist1.listIterator();
        while (itr1.hasNext()) {
            Integer itn1 = (Integer) itr1.next();
            if (mylist2.contains(itn1) == false)
                mylist2.add(itn1);
        }

        System.out.println(mylist2);

    }

}
于 2014-06-06T20:11:35.763 に答える