2017-02-04 44 views
0

Javaコードに問題があります。私はループを使用して、他の方法を使用するはずです。私ArrayLisトンがArrayListの重複を削除する - Java

の含まれていることを セイ[犬猫犬犬猫犬馬]

私の最終的な結果は

に等しいので、私の目標は、犬と猫のコピーを削除することもあります

[犬猫馬]

public void removeDouble(){ 

int counter = 0; 
for (int i = 0 ; i < animals.size(); i++) { 
    for (int j = 1+i; j < animals.size() ; j++) 
     //don't start on the same word or you'll eliminate it. 
     if (animals.get(j).equals(animals.get(i)) ) { 
      animals.remove(animals.get(j)); 
      counter++; 

     }         
    } 
} 

"ロジック"は正しいと感じますが、私のコードはうまく動作しません。誰か助けてくれますか?

+1

* "ロジック"が正しいと感じますが、私のコードはうまく動作しません。あなたはこれを詳しく説明できますか?出力は何ですか?あなたはそれが何を期待していましたか? 'List'を反復している間、それを削除することはお勧めできません。 – CKing

答えて

0

あなたの現在のコード - これを実行するための簡単な方法

for (int i = 0; i < animals.size(); i++) { 
    for (int j = 1 + i; j < animals.size(); j++) 
     if (animals.get(j).equals(animals.get(i))) { 
      animals.remove(animals.get(j)); // this would remove the current element only if the previous element is same as the current element 
      // since the index `j` would change post that 
     } 
    } 
} 

animals.stream().distinct().collect(Collectors.toList()).forEach(System.out::print); 

または使用している -

Set<String> distAnimal = new HashSet<>(animals); 
System.out.println(Arrays.toString(distAnimal.toArray())); 
+1

'私はループを使用していますが、他の方法は使用していません。 – camickr

0

あなたのあなたがそれらを反復されるアイテムの削除、インデックスを保持する配列を持ち、ダブルを見つけたらインデックス配列にインデックスを追加します。インデックス配列を繰り返して、動物のarraylistから削除します。

2

内部ループのロジックが正しくありません。

同じアイテムがリストに連続して表示されるたびに、アイテムをスキップします。

あなたが「犬」、「犬」、「犬」、「猫」を持っていたとします。インデックス1の "dog"を削除すると、リストは "dog"、 "dog"、 "cat"になります。

"j"インデックスが2に増えて、次のテストが "犬"アイテムではなく "cat"アイテムにアクセスするという問題があります。したがって、ある項目を削除するたびに、リスト内の次の項目がスキップされます。その結果、矛盾した結果が得られます。

  1. デクリメントj変数たびにあなたは、リストの末尾から内部ループを開始する項目に
  2. を削除し、0
に向かって逆方向にカウントダウン:

は解決策はどちらかに

ある

1

リストの最後から開始し、カウンタを減らす方が簡単です。 iでdoubleを削除した後、jに達するとさらにdoubleが検出されるので、文字列全体をチェックせずに中断することができます。あなたは以前の要素を取り除くため、インデックスが変更されている(そして、あなたのアカウントにそれを取るために、インデックスを調整するために失敗した)前進と後退

for(int i=animals.size()-1; i>0; i--) { 
     for(int j=i-1; j>=0; j--) { 
      if(animals.get(i).equals(animals.get(j))) { 
       animals.remove(i); 
       break; 
      } 
     } 
    } 

は、問題を回避できます。

最初に一致するオブジェクトが削除される原因となる、remove(index)ではなくremove(object)を使用していたロジックのもう1つの問題。ただし、期待される出力に基づいて、最初に一致するオブジェクトの順序を保持する必要があります。その代わりに、indexを介して最後に一致するオブジェクトを削除してください。

for(int i=0; i<animals.size()-1; i++) { 
     ListIterator<?> iter = animals.listIterator(i+1); 
     while(iter.hasNext()) { 
      if(animals.get(i).equals(iter.next())) { 
       iter.remove(); 
      } 
     } 
    } 


あなたは後方ではなく前方に移動したいが、あなたは除去した後に、インデックスへの調整を行うことを希望しない場合は、反復子のremoveメソッドを利用することが可能です

残念ながら、ここでの外部ループは、イテレータを使用できません。これは、ConcurrentModificationExceptionが発生するためです。


最後に、あなたはまた、単一の明示的なループでそれを解決するためのsubListを使用することができます。

for(int i=0; i<animals.size()-1; i++) { 
     animals.subList(i+1, animals.size()).removeIf(animals.get(i)::equals); 
    } 
0

あなたはこのように行うことができます。

ArrayList<String>list=new ArrayList<>(); 
    list.add("A"); 
     list.add("B"); 
     list.add("C"); 
     list.add("A"); 
    System.out.println("Before "+list); // output[A,B,C,A] 


    Set<String> listWithoutDuplicates = new LinkedHashSet<String>(list); 
    list.clear(); 

    list.addAll(listWithoutDuplicates); 
    System.out.println("list without duplicates : " + list);// output[A,B,C] 
0

ありがとうございました。私はまだいくつかの問題があります。これは私が思いついたものです。

int counter =0; 
for(int i = 0 ; i < animals.size() ; i++){ 
    for(int j = animals.size() -1 ; j>i ; j--){ 
     if(animals.get(j).equals(animals.get(i))){ 
      counter++; 

} 

    } 
} 
    System.out.println(counter); 
} 

これで、ArrayListの最後から内側ループを開始します。優先順位は今はループを稼働させてから削除などを追加するだけです。

乾杯!

関連する問題