2017-10-10 47 views
0

我试图删除那些基于它们在值列表中的位置的特定项目。 下面的代码,如复制列表缩小太多如何根据列表中的位置从列表中删除值?

private ArrayList<String> removeGen(int addLines, int labLines, int venLines, ArrayList<String> values){ 
     ArrayList<String> copy = new ArrayList<>(); 
     copy = (ArrayList<String>) values.clone(); 
     for(int i = 0; i < values.size(); i++) { 
      if (i > 100 && i < (100 + (addLines * 5) + 1)) { 
       copy.remove(i); 
      } 

      if (i > (100 + (addLines * 5)) + 9 && i < 100 + (addLines * 5) + (labLines * 4) + 10) { 
       copy.remove(i); 
      } 

      if (i > 100 + (addLines * 5) + (labLines * 4) + 21 && i < 100 + (addLines * 5) + (labLines * 4) + (venLines * 4) + 22) { 
       copy.remove(i); 
      } 
     } 

     return copy; 

的问题是一些值从一个区分彼此,所以我也不能使用卸妆(OBJ)抛出一个错误。

我该如何返回一个列表,并在上述位置删除值?

+0

你应该能够删除这样的条目,因为你是通过索引而不是按值来删除某些内容的。 – LenglBoy

+0

仍然复制列表的大小减少,因为它的项目被删除制作,他们的位置变化都很好虽然检查了这一点 – Jube

回答

1

您正在删除索引而不是数值,但是您忘记了values的索引是除去某物后copy中的索引。 每个对象在删除后都会得到另一个索引,因此列表不再一样。

示例: 删除索引4后,索引5正在索引4上获取新值。此切换效果将一直持续到列表结束。

因此,有两种方法可以使这一个正确的:

  1. 转身的条件和所有有效数据添加到copy,并给这个名单了。
  2. 将指针i处的值清空,然后在返回之前过滤列表。 return copy.filter(x -> x != null).collect(Collectors.toList()); 如果使用的Java 7 you're,降低您可以使用copy.removeAll(Collections.singleton(null));

这里的第一个结果:

ArrayList<String> copy = new ArrayList<>(); 
for(int i = 0; i < values.size(); i++) { 
    if (i < 100 && i > (100 + (addLines * 5) + 1)) { 
     copy.add(values.get(i)); 
    } 

    if (i < (100 + (addLines * 5)) + 9 && i > 100 + (addLines * 5) + (labLines * 4) + 10) { 
     copy.add(values.get(i)); 
    } 

    if (i < 100 + (addLines * 5) + (labLines * 4) + 21 && i > 100 + (addLines * 5) + (labLines * 4) + (venLines * 4) + 22) { 
     copy.add(values.get(i)); 
    } 
} 

return copy; 

在这里,第二个结果:

ArrayList<String> copy = new ArrayList<>(); 
copy = (ArrayList<String>) values.clone(); 
for(int i = 0; i < values.size(); i++) { 
    if (i > 100 && i < (100 + (addLines * 5) + 1)) { 
     copy.get(i) = null; 
    } 

    if (i > (100 + (addLines * 5)) + 9 && i < 100 + (addLines * 5) + (labLines * 4) + 10) { 
     copy.get(i) = null; 
    } 

    if (i > 100 + (addLines * 5) + (labLines * 4) + 21 && i < 100 + (addLines * 5) + (labLines * 4) + (venLines * 4) + 22) { 
     copy.get(i) = null; 
    } 
} 

return copy.filter(x -> x != null).collect(Collectors.toList()); 
0
private ArrayList<Integer> removeGen(int addLines, int labLines, int venLines, ArrayList<String> values){ 
     ArrayList<String> copy = new ArrayList<>(); 
     ArrayList<Integer> numbers = new ArrayList<>(); 
     copy = (ArrayList<String>) values.clone(); 
     for(int i = 0; i < values.size(); i++) { 
      if (i > 100 && i < (100 + (addLines * 5) + 1)) { 
       //copy.remove(i); 
      } 
      else if(i > (100 + (addLines * 5)) + 9 && i < 100 + (addLines * 5) + (labLines * 4) + 10) { 
       //copy.remove(i); 
      } 

      else if(i > 100 + (addLines * 5) + (labLines * 4) + 21 && i < 100 + (addLines * 5) + (labLines * 4) + (venLines * 4) + 22) { 
       //copy.remove(i); 
      } 
      else { 
       numbers.add(i); 
      } 


     } 
     return numbers; 

    } 

只是做相反,并提取我需要的位置,应该有助于他人

ArrayList<Integer> tempList = removeGen(additional,labour,vendor,values); 

     for (int j = 0; j < tempList.size(); j++) { 
      template = template.replaceFirst(section + j, values.get(tempList.get(j))); 
     }