2016-12-16 77 views
0

如何在循環列表時重置循環?例如,當列表中有重複項時,我希望for循環重置,即(i = 0和j = 1)。從列表中刪除元素時重置循環

在這段代碼中,當列表中的後續條目相等時,我希望刪除重複項並重置for循環。舉例來說,我們有

列表1 = [東,西,西部,東部]

我想要的結果列表1等於一個空列表。

這是因爲,當兩個「west」條目都被刪除時,這會導致列表更新爲[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

如果你想刪除重複項,爲什麼不使用Set?

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

我想要這兩個條目被刪除,如果他們隨後出現在列表中。 例如,如果列表中包含: 「一」, 「B」, 「B」, 「一」, 「d」, 「E」, 「F」 應該應該被更新爲: 「d 「」,「e」,「f」 因爲當「b」,「b」被刪除時,您有「a」,「a」,「d」,「e」,「f」條目也需要刪除給予: 「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

這對於東,西,西,東,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; 
} 

另外一個音符,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 
     } 
    }