546

がありArrayList<String>、そこから繰り返される文字列を削除したいと考えています。これどうやってするの?

4

39 に答える 39

1062

で重複したくない場合はCollection、重複を許可する を使用している理由を検討する必要がありますCollection。繰り返し要素を削除する最も簡単な方法は、コンテンツを a に追加しSet(重複を許可しません)、次にSetback を に追加することArrayListです。

Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);

もちろん、これは 内の要素の順序を破壊しArrayListます。

于 2008-10-15T08:11:27.693 に答える
307

をに変換するArrayListHashSet効果的に重複が削除されますが、挿入順序を維持する必要がある場合は、このバリアントを使用することをお勧めします

// list is some List of Strings
Set<String> s = new LinkedHashSet<>(list);

その後、List参照を取得する必要がある場合は、変換コンストラクターを再度使用できます。

于 2008-10-15T08:18:19.550 に答える
53

重複したくない場合は、 の代わりにSetListを使用してください。Listaを aに変換するにSetは、次のコードを使用できます。

// list is some List of Strings
Set<String> s = new HashSet<String>(list);

本当に必要な場合は、同じ構造を使用して a を に変換できSetますList

于 2008-10-15T08:13:48.343 に答える
28

リストの順序に影響を与えない方法は次のとおりです。

ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();

Iterator iterator = l1.iterator();

while (iterator.hasNext()) {
    YourClass o = (YourClass) iterator.next();
    if(!l2.contains(o)) l2.add(o);
}

l1 は元のリストで、l2 は繰り返し項目のないリストです (等号の意味に応じて、YourClass に equals メソッドがあることを確認してください)。

于 2010-12-28T16:07:10.687 に答える
27

Java 8 ストリームは、重複する要素をリストから削除するための非常に簡単な方法を提供します。個別の方法を使用します。都市のリストがあり、そのリストから重複を削除したい場合は、1 行で実行できます -

 List<String> cityList = new ArrayList<>();
 cityList.add("Delhi");
 cityList.add("Mumbai");
 cityList.add("Bangalore");
 cityList.add("Chennai");
 cityList.add("Kolkata");
 cityList.add("Mumbai");

 cityList = cityList.stream().distinct().collect(Collectors.toList());

配列リストから重複した要素を削除する方法

于 2015-08-12T17:30:38.417 に答える
21

オプションとしてGuavaImmutableSetからもあります(ドキュメントはこちら):

ImmutableSet.copyOf(list);
于 2011-12-09T22:55:49.180 に答える
21

HashSetまたはもう 1 つのarraylist を使用せずに、arraylist から重複を削除することができます。

このコードを試してください..

    ArrayList<String> lst = new ArrayList<String>();
    lst.add("ABC");
    lst.add("ABC");
    lst.add("ABCD");
    lst.add("ABCD");
    lst.add("ABCE");

    System.out.println("Duplicates List "+lst);

    Object[] st = lst.toArray();
      for (Object s : st) {
        if (lst.indexOf(s) != lst.lastIndexOf(s)) {
            lst.remove(lst.lastIndexOf(s));
         }
      }

    System.out.println("Distinct List "+lst);

出力は

Duplicates List [ABC, ABC, ABCD, ABCD, ABCE]
Distinct List [ABC, ABCD, ABCE]
于 2013-10-17T18:38:14.440 に答える
12

少しやり過ぎかもしれませんが、私はこの種の孤立した問題を楽しんでいます。:)

このコードは一時的な Set を (一意性チェックのために) 使用しますが、元のリスト内の要素を直接削除します。ArrayList 内の要素を削除すると大量の配列コピーが発生する可能性があるため、remove(int) メソッドは使用されません。

public static <T> void removeDuplicates(ArrayList<T> list) {
    int size = list.size();
    int out = 0;
    {
        final Set<T> encountered = new HashSet<T>();
        for (int in = 0; in < size; in++) {
            final T t = list.get(in);
            final boolean first = encountered.add(t);
            if (first) {
                list.set(out++, t);
            }
        }
    }
    while (out < size) {
        list.remove(--size);
    }
}

作業中ですが、ここに LinkedList のバージョンを示します (はるかに優れています!)。

public static <T> void removeDuplicates(LinkedList<T> list) {
    final Set<T> encountered = new HashSet<T>();
    for (Iterator<T> iter = list.iterator(); iter.hasNext(); ) {
        final T t = iter.next();
        final boolean first = encountered.add(t);
        if (!first) {
            iter.remove();
        }
    }
}

マーカー インターフェイスを使用して、List の統一されたソリューションを提示します。

public static <T> void removeDuplicates(List<T> list) {
    if (list instanceof RandomAccess) {
        // use first version here
    } else {
        // use other version here
    }
}

編集:ここでは、ジェネリックのものは実際には何の価値も追加しないと思います..まあ。:)

于 2008-10-18T16:11:35.457 に答える
3

Order を保持したい場合は、LinkedHashSetを使用するのが最善です。このリストを反復して挿入クエリに渡したい場合は、順序が保持されるためです。

これを試して

LinkedHashSet link=new LinkedHashSet();
List listOfValues=new ArrayList();
listOfValues.add(link);

この変換は、セットではなくリストを返したい場合に非常に役立ちます。

于 2013-10-12T12:51:01.780 に答える
2

ArrayList を埋めるときは、各要素に条件を使用します。例えば:

    ArrayList< Integer > al = new ArrayList< Integer >(); 

    // fill 1 
    for ( int i = 0; i <= 5; i++ ) 
        if ( !al.contains( i ) ) 
            al.add( i ); 

    // fill 2 
    for (int i = 0; i <= 10; i++ ) 
        if ( !al.contains( i ) ) 
            al.add( i ); 

    for( Integer i: al )
    {
        System.out.print( i + " ");     
    }

配列 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} を取得します

于 2011-04-11T08:17:38.553 に答える
2
ArrayList<String> city=new ArrayList<String>();
city.add("rajkot");
city.add("gondal");
city.add("rajkot");
city.add("gova");
city.add("baroda");
city.add("morbi");
city.add("gova");

HashSet<String> hashSet = new HashSet<String>();
hashSet.addAll(city);
city.clear();
city.addAll(hashSet);
Toast.makeText(getActivity(),"" + city.toString(),Toast.LENGTH_SHORT).show();
于 2016-03-26T10:13:30.243 に答える
1
        List<String> result = new ArrayList<String>();
        Set<String> set = new LinkedHashSet<String>();
        String s = "ravi is a good!boy. But ravi is very nasty fellow.";
        StringTokenizer st = new StringTokenizer(s, " ,. ,!");
        while (st.hasMoreTokens()) {
            result.add(st.nextToken());
        }
         System.out.println(result);
         set.addAll(result);
        result.clear();
        result.addAll(set);
        System.out.println(result);

output:
[ravi, is, a, good, boy, But, ravi, is, very, nasty, fellow]
[ravi, is, a, good, boy, But, very, nasty, fellow]
于 2015-08-02T09:54:03.153 に答える
1

前に述べたように、List の代わりに Set インターフェイスを実装するクラスを使用して、要素の単一性を確保する必要があります。要素の順序を維持する必要がある場合は、SortedSet インターフェイスを使用できます。TreeSet クラスはそのインターフェイスを実装します。

于 2008-10-15T13:48:30.757 に答える
1
for(int a=0;a<myArray.size();a++){
        for(int b=a+1;b<myArray.size();b++){
            if(myArray.get(a).equalsIgnoreCase(myArray.get(b))){
                myArray.remove(b); 
                dups++;
                b--;
            }
        }
}
于 2012-01-22T15:23:18.183 に答える
0
public Set<Object> findDuplicates(List<Object> list) {
        Set<Object> items = new HashSet<Object>();
        Set<Object> duplicates = new HashSet<Object>();
        for (Object item : list) {
            if (items.contains(item)) {
                duplicates.add(item);
                } else { 
                    items.add(item);
                    } 
            } 
        return duplicates;
        }
于 2013-08-29T07:21:09.310 に答える
0

このようなものはうまくいきますか?

public static void removeDuplicates(ArrayList<String> list) {
    Arraylist<Object> ar     = new Arraylist<Object>();
    Arraylist<Object> tempAR = new Arraylist<Object>();
    while (list.size()>0){
        ar.add(list(0));
        list.removeall(Collections.singleton(list(0)));
    }
    list.addAll(ar);
}

これは順序を維持する必要があり、実行時に 2 次であってはなりません。

于 2015-12-02T02:23:21.667 に答える
0

これが、セットやハッシュマップなどの他のデータ構造を使用しない私の答えです。

public static <T> ArrayList<T> uniquefy(ArrayList<T> myList) {

    ArrayList <T> uniqueArrayList = new ArrayList<T>();
    for (int i = 0; i < myList.size(); i++){
        if (!uniqueArrayList.contains(myList.get(i))){
            uniqueArrayList.add(myList.get(i));
        }
    }

    return uniqueArrayList;
}
于 2015-09-23T09:36:02.547 に答える
0

@ jonathan-stafford ソリューションは問題ありません。しかし、これはリストの順序を保持しません。

リストの順序を維持したい場合は、これを使用する必要があります。

public static <T> void removeDuplicate(List <T> list) {
Set <T> set = new HashSet <T>();
List <T> newList = new ArrayList <T>();
for (Iterator <T>iter = list.iterator();    iter.hasNext(); ) {
   Object element = iter.next();
   if (set.add((T) element))
      newList.add((T) element);
   }
   list.clear();
   list.addAll(newList);
}

答えを完成させるだけです。とても良い!

于 2015-07-01T11:54:45.330 に答える
0

リストで重複を自動的に無視して順序を維持する場合は、 HashList (HashMap が埋め込まれたリスト)を作成できます。

public static class HashList<T> extends ArrayList<T>{
        private HashMap <T,T> hashMap;
        public HashList(){
            hashMap=new HashMap<>();
        }

        @Override
        public boolean add(T t){
            if(hashMap.get(t)==null){
                hashMap.put(t,t);
                return super.add(t);
            }else return false;
        }

        @Override
        public boolean addAll(Collection<? extends T> c){
            HashList<T> addup=(HashList<T>)c;
            for(int i=0;i<addup.size();i++){
                add(addup.get(i));
            }return true;
        }

    }

Usage Example:

HashList<String> hashlist=new HashList<>();
hashList.add("hello");
hashList.add("hello");
System.out.println(" HashList: "+hashlist);
于 2019-03-09T01:44:37.810 に答える
0
import java.util.*;
class RemoveDupFrmString
{
    public static void main(String[] args)
    {

        String s="appsc";

        Set<Character> unique = new LinkedHashSet<Character> ();

        for(char c : s.toCharArray()) {

            System.out.println(unique.add(c));
        }
        for(char dis:unique){
            System.out.println(dis);
        }


    }
}
于 2012-09-30T21:45:41.383 に答える
0
    ArrayList<String> list = new ArrayList<String>();
    HashSet<String> unique = new LinkedHashSet<String>();
    HashSet<String> dup = new LinkedHashSet<String>();
    boolean b = false;
    list.add("Hello");
    list.add("Hello");
    list.add("how");
    list.add("are");
    list.add("u");
    list.add("u");

    for(Iterator iterator= list.iterator();iterator.hasNext();)
    {
        String value = (String)iterator.next();
        System.out.println(value);

        if(b==unique.add(value))
            dup.add(value);
        else
            unique.add(value);


    }
    System.out.println(unique);
    System.out.println(dup);
于 2014-06-13T12:51:39.000 に答える
0

ArrayList から重複を削除したい場合は、以下のロジックを見つけることを意味します。

public static Object[] removeDuplicate(Object[] inputArray)
{
    long startTime = System.nanoTime();
    int totalSize = inputArray.length;
    Object[] resultArray = new Object[totalSize];
    int newSize = 0;
    for(int i=0; i<totalSize; i++)
    {
        Object value = inputArray[i];
        if(value == null)
        {
            continue;
        }

        for(int j=i+1; j<totalSize; j++)
        {
            if(value.equals(inputArray[j]))
            {
                inputArray[j] = null;
            }
        }
        resultArray[newSize++] = value;
    }

    long endTime = System.nanoTime()-startTime;
    System.out.println("Total Time-B:"+endTime);
    return resultArray;
}
于 2014-09-11T06:52:56.530 に答える
-2

Java では、List はそれらの要素への順序付きアクセスを許可します。ルックアップ キーは一部のハッシュ コードではなく位置であるため、重複する可能性があります。すべての要素は、セットが一意の要素のコレクションを表し、要素がセットされている間は変更してはなりません。セット内の要素を変更することを妨げる制限はありません。要素が変更されると、セット内で永久に失われる可能性があります。

public static void main(String[] args) {
       List<String> l = new ArrayList<String>();
       l.add("A");
       l.add("B");
       l.add("C");
       l.add("A");
       System.out.println("Before removing duplicates: ");
       for (String s : l) {
            System.out.println(s);
       }
       Set<String> set = new HashSet<String>(l);
       List<String> newlist = new ArrayList<String>(set);
       System.out.println("after removing duplicates: ");
       for (String s : newlist) {
            System.out.println(s);
       }
  }

参考までに、このリンクを参照してくださいArrayListから重複を削除する方法

于 2015-11-17T07:26:39.697 に答える