0

隣り合っているものを除いて、ほとんどの重複を削除できます。何が間違っているのかわかりません。現在、int を ArrayList の残りの部分と比較する for ループをネストしています。セットアップまたはインクリメントの方法を除いて、最初のforループをもう一度開始する場所の隣にある複製をスキップしています。インデックス j を削除した後、i=0 をリセットすると便利であることがわかりました。重複が隣り合っている場合でも、重複は削除されません。

for(int i=0;i<original.size();i++){
    for(int j=i+1;j<original.size();j++){
        if(original.get(i)==original.get(j)){
            original.remove(j);   
        }
    }
}

編集: 2 番目の for ループを while ループに変更し、毎回インクリメントしたときに解決策を見つけましたが、重複を見つけたときに j から 1 を削除しました。そうすれば、最初からやり直すことになります。

皆さん、ありがとうございました。

4

10 に答える 10

0
ArrayList<String> wordDulicate = new ArrayList<String>();
ArrayList<String> tempList= new ArrayList<String>();

    wordDulicate.add("7");
    wordDulicate.add("7");
    wordDulicate.add("7");

    for (String dupWord : wordDulicate)
    {
      if (!tempList.contains(dupWord)) 
      {
        System.out.println(dupWord);
        tempList.add(dupWord);
      }
    }

ではtemplist、重複したエントリは取得されません。

于 2013-11-11T06:23:28.480 に答える
0

参照ではなく値を見ているため、の代わりにHashSetを使用する必要があるにもかかわらず、を使用したくない理由がわかりません。さらに、ループを使用していて、リストから要素を削除する場合、要素をスキップするため、インクリメントはしたくありません。これは明らかにしたくないことです。.equals()==j

于 2013-11-11T05:42:35.480 に答える
0

リストをインデックスでループして削除するときはいつでも、「逆方向」にループする必要があります。j を逆方向にループさせます。そうしないと、エントリをスキップしてしまいます。@BinaryManも指摘したように。

例 (== の代わりに equals() も使用することに注意してください)

for(int i=original.size()-1;i>=0;i--){
    for(int j=original.size()-1;j>i;j--){
        if(original.get(i).equals(original.get(j))){
            original.remove(j);   
        }
    }
}
于 2013-11-11T05:46:44.917 に答える
0
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class RemDupFromList {

    public static void main(String[] args)
    {
        List li = new ArrayList();

              li.add("one");
              li.add("two");
              li.add("three");
              li.add("one");//Duplicate
              li.add("one");//Duplicate

             // We have facility to pass a List into Set constructor and vice verse to cast      

                List li2 = new ArrayList(new HashSet(li)); //no order

             // List li2 = new ArrayList(new LinkedHashSet(li)); //If you need to preserve the order use 'LinkedHashSet'

             Iterator it= li2.iterator();
             while(it.hasNext())
             {
                 System.out.println(it.next());
             }

    }
}
于 2013-11-11T05:59:41.920 に答える
0

リストが次のようになっているとします。[a,a,a,b,c,a]

これは、反復がどのように見えるかです (ビューは、反復が完了した後、削除または削除なし):

i=0, size = 6 , j=1, arr[i] = a, arr[j] = a, view: [a,a,b,c,a]; (arr[i]==arr[j], will delete)
i=0, size = 5,  j=2, arr[i] = a, arr[j] = b, view: [a,a,b,c,a]; (arr[i]!=arr[j])
i=0, size = 5,  j=3, arr[i] = a, arr[j] = c, view: [a,a,b,c,a]; (arr[i]!=arr[j])
i=0, size = 5,  j=4, arr[i] = a, arr[j] = a, view: [a,a,b,c];   (arr[i]==arr[j], will delete)
i=1, size = 4,  j=2, arr[i] = a, arr[j] = b, view: [a,a,b,c];   (arr[i]!=arr[j])
i=1, size = 4,  j=3, arr[i] = a, arr[j] = c, view: [a,a,b,c];   (arr[i]!=arr[j])
i=2, size = 4,  j=3, arr[i] = b, arr[j] = c, view: [a,a,b,c];   (arr[i]!=arr[j])
i=3, size = 4, .......

j = i + 1であるため、隣人は削除されません。要素を削除すると、配列が1つのインデックスだけ下にシフトされるため、互いにチェックする機会が得られないため、次の反復でチェックしようとしていたアイテムは実際にはスキップした理由j=i+1

于 2013-11-11T05:48:29.893 に答える
0

配列要素が int の場合、最初に配列をソートする方が効率的です

    Collections.sort(list);
    Iterator<Integer> i = list.iterator();
    int prev = i.next();
    while (i.hasNext()) {
        int next = i.next();
        if (next == prev) {
            i.remove();
        } else {
            prev = next;
        }
    }

for Integersはoriginal.get(i)==original.get(j)値を比較しないことに注意してください。new Integer(1000) == new Integer(1000)false

于 2013-11-11T05:51:20.107 に答える