2016-12-16 84 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 
     } 
    }