2011-01-24 14 views
3

私は古いシステムでいくつかの保守作業を行っています。私は 次の値が含まれているのArrayListを持っている:arraylist重複値を取り除く方法

a,b,12 
c,d,3 
b,a,12 
d,e,3 
a,b,12 

私はそれが同じ重複する値が見つかった場合には、正常に動作しますArrayListの

ArrayList<String> arList; 
    public static void removeDuplicate(ArrayList arlList) 
    { 
    HashSet h = new HashSet(arlList); 
    arlList.clear(); 
    arlList.addAll(h); 
    } 

から重複する値を削除するには、次のコードを使用していました。しかし、自分のデータが慎重に表示されている場合は、 に重複したエントリがいくつかありますが、同じ順序ではありません。たとえば、a、b、12およびb、a、12は同じ順序で異なるが、 です。

arraylistからこのような重複エントリを削除するにはどうすればよいですか?

ありがとうございました

+0

あなたは本当に近いです。セットを試してみてください。 – Crisfole

+0

@Cpfohl - あなたはもっと正確になりますか? – Tweet

+0

うん、しかし、まずこれに答えることができます:あなたの配列リストは何のセットですか? (文字配列?番号?クラス?) – Crisfole

答えて

3

エントリが文字列であると仮定します。次に、各エントリをソートして、重複チェックを実行できます。次に、エントリをマップに格納し、contains(キー)を使用してエントリが存在するかどうかを確認できます。

EDIT:完全なコード例を追加しました。

public class Test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Test test = new Test(); 
     List<String> someList = new ArrayList<String>(); 
     someList.add("d,e,3"); 
     someList.add("a,b,12"); 
     someList.add("c,d,3"); 
     someList.add("b,a,12"); 
     someList.add("a,b,12"); 
      //using a TreeMap since you care about the order 
     Map<String,String> dupMap = new TreeMap<String,String>(); 
     String key = null; 
     for(String some:someList){ 
      key = test.sort(some); 
      if(key!=null && key.trim().length()>0 && !dupMap.containsKey(key)){ 
       dupMap.put(key, some); 
      } 
     } 
     List<String> uniqueList = new ArrayList<String>(dupMap.values()); 
     for(String unique:uniqueList){ 
      System.out.println(unique); 
     } 

    } 
    private String sort(String key) { 
     if(key!=null && key.trim().length()>0){ 
     char[] keys = key.toCharArray(); 
     Arrays.sort(keys); 
     return String.valueOf(keys); 
     } 
     return null; 
    } 
} 

プリント:

、B、12

C、D、3

D、E、3

+0

最初のソリューションです性能面で高価であり、また、何らかの障害の問題を引き起こす可能性がある。2番目の解決策は動作しません。なぜなら、キーを含むことは異なる順序では機能しないからです。 – Tweet

+0

なぜあなたはString.splitが高価すぎると思いますか?私はそれが速くできるとは思わない。どのような障害の問題?あなたはあなたの中のアイテムの順序を気にしますか? List >以上を使用しないでください。List の代わりにを設定してください。あなたの重複削除は、とにかく、リストを使用する理由は、順序を破壊する? – maaartinus

+0

私は文字列で気にします。それはソフトウェアの主要な処理モジュールの小さな部分です、私が分割を開始する場合、それは私のパフォーマンスがかかるかもしれません。すべてのarraylistsには数十万のレコードが含まれています。 – Tweet

1

周りをラップするクラスを作成します。行ストリング(トリプレット)を使用して、等価セマンティクスを提供します。 equals()メソッドとhashCode()メソッドを実装します。次に、HashSetメソッドを使用して重複を削除します。

2

ラップ代わりに "String" の "Foo" などの要素、残りのコード 'removeDuplicateは' 残り:次に

public class Foo { 
    private String s1; 
    private String s2; 
    private String s3; 

    public Foo(String s1, String s2, String s3) { 
    this.s1 = s1; 
    this.s2 = s2; 
    this.s3 = s3; 
    } 

@Override 
    public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((s1 == null) ? 0 : s1.hashCode()); 
    result = prime * result + ((s2 == null) ? 0 : s2.hashCode()); 
    result = prime * result + ((s3 == null) ? 0 : s3.hashCode()); 
    return result; 
    } 

@Override 
    public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Foo other = (Foo) obj; 
    //Notice here: 'a,b,12' and 'b,a,12' will be same 
    if(fieldsAsList().containsAll(other.fieldsAsList())){ 
     return true; 
    } 

    return false; 
    } 

private List<String> fieldsAsList(){ 
    ArrayList<String> l = new ArrayList<String>(3); 
    l.add(s1); 
    l.add(s2); 
    l.add(s3); 
    return l; 
}  
} 

arListArrayList < Foo>になります。

-1

を試してみてください。セットは重複を許さないので、セットで達成することができるので、HashSetクラスまたはLinkedHashSetクラスを使用する方がよい。 referenceを参照してください。

関連する問題