2016-12-16 9 views
0

リストをループしてforループをリセットするにはどうすればよいですか?例えば、リストに重複がある場合、forループをリセットする、すなわち(i = 0およびj = 1)を欲しい。リストから要素を削除するときのforループのリセット

このコードでは、リスト内の後続のエントリが等しいときに重複を削除し、forループをリセットします。例えば、我々は

リスト1 = [東、西、西、東]

を持っている私は、得られLIST1は空のリストに等しくなるようにしたいです。

これは、両方の「西」エントリが削除されると、リストが[east、east]に更新されるためです。これも重複しているので、結果は空のリスト[]でなければなりません。

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

重複したデータを削除するために書き込みログインを使用するのではなく、コレクションを使用できます。 –

+0

問題がある部分について詳しく教えてください。あなたの質問は、 'ループをリセットする方法'ですが、コードは既にループをリセットするために必要な行を持っています。 –

+0

これはリストイテレータを使用する必要があります。 – Traubenfuchs

答えて

1

重複を削除したい場合は、セットを使用しないでください。

String[] list1 = {"east", "west", "west", "east"}; 
List<String> list = new ArrayList<>(Arrays.asList(list1)); 
Set<Object> alreadyPresent = new HashSet<>(); 

Iterator<String> iterator = list.iterator(); 
for (String element : new ArrayList<String>(list)) { 
    if (!alreadyPresent.add(element)) { 
     while(list.remove(element)); 
    } 
} 

編集(はるかに良い):

String[] list1 = {"a","b","b","a","d","e","f"}; 
List<String> list = new ArrayList<>(Arrays.asList(list1)); 

for (String element : new ArrayList<String>(list)) { 
    if(Collections.frequency(list, element) > 1) { 
     while(list.remove(element)); 
    } 
} 
+0

リスト内に後で存在する場合は、両方のエントリを削除します。リストが含まれている場合 例えば: 「D: "A"、 "B"、 "B"、 "A"、 "D"、 "E"、 "F" をそれに更新されなければならない必要があります"a"、 "d"、 "e"、 "f"を持つので、 "a"と "b"の両方が削除されているため、エントリも削除する必要があります。 "d"、 "e"、 "f" – tsizzle9

+0

@ tsizzle9:回答を更新しました。 – r3n0j

0
List<String> list1 = new ArrayList<String>(); 
    list1.add("east"); 
    list1.add("east"); 
    list1.add("west"); 
    list1.add("test"); 
    list1.add("west"); 
    int j=1; 
    for (int i=0;i<list1.size();i++){ 
     //here you can say if you want exactly two or more 
     if(Collections.frequency(list1, list1.get(i)) > 1) { 
      list1.removeAll(Collections.singleton(list1.get(i))); 
      i=0; 
     } 

    } 
    System.out.println(list1); 
1

あなた逆転のArrayListをループすることができます

ArrayList<String> list1 = new ArrayList<String>(Arrays.asList(new String[]{"east", "west", "west", "east", "foo"})); 
for (int i = (list1.size() - 2);i >= 0;i--){ 
    for(int j = (list1.size() - 1);j > i;j--) { 
     if((list1.get(i).equals(list1.get(j)))) { 
      list1.remove(i); 
      list1.remove(i); 
     } 
    } 
} 
System.out.println(list1); 
+0

これはすでに 'east、west、west、east、foo'で失敗します。 ;-) – SubOptimal

+0

あなたは正しい@SubOptimal :)私は自分の答えを更新しました。 – salix

0

はもう少しあなたのコードをモジュールお試しください!

// The function you are trying to impliment 
void removePairs(List<Object> list) { 
    while (removePair(list)) {} 
} 

それがどこにある

// Return true if successfully removed a pair 
boolean removePair (List<Object> list) { 
    for(i = 0; i < list.size() - 1; i++) { 
     // Get the next objects 
     Object firstObject = list.get(i); 
     Object secondObject = list.get(i + 1); 

     if (firstObject.equals(secondObject)) { 
       list.remove(i); 
       list.remove(i + 1); 
       return true; 
     } 
    } 

    return false; 
} 

Oneのは、私たちの生活を楽にするためのヘルパーメソッドを使用してみましょう他のノート、j = 1はすべきではありません。私は可変スコープを参照しています。あなたの元のコードでは、forループが完了した後にjについて(うまくいけば)気にしません。しかし、それはまだ掛かってはいけません何かのために使用されるときにバグを引き起こすのを待っています!

0

問題を報告する:値を複製する順序で[..., a, a, ...]が表示され、それらを削除して再帰したい場合。

最も読み難いのは、jか、int j = i - 1;です。

List<String> list = new ArrayList<>(); 
    Collections.addAll(list, "east", "west", "west", "east"); 
    for (int i = 1; i < list.size(); ++i) { 
     String value = list.get(i); 
     int priorI = i - 1; 
     if (value.equals(list.get(priorI))) { 
      list.remove(priorI); 
      list.remove(priorI); 
      // next i will be priorI but at least 1 
      i = Math.max(0, priorI - 1); // With ++i will be > 0 
     } 
    } 
関連する問題