如何从列表的副本中删除列表中的值?

时间:2017-10-10 13:47:18

标签: java android

我尝试根据其在值列表中的位置删除这些特定项目。 下面的代码在副本列表缩小太多时抛出错误

True

问题是某些值无法区分,所以我也不能使用remover(obj)。

如何返回在上述位置删除了值的列表?

2 个答案:

答案 0 :(得分:1)

您是在索引处删除而不是按值删除,但是您忘记了values的索引是除了copy之后的其他索引。 删除后,每个对象都会获得另一个索引,因此列表不再相同。

实施例: 删除索引4后,索引5将获得索引4上的新值。此切换效果将一直持续到列表的末尾。

所以有两种方法可以使这一个正确:

  1. 转换条件并将所有有效数据添加到copy并重新提供此列表。
  2. 在索引i处取消值,然后在返回之前过滤列表。 return copy.filter(x -> x != null).collect(Collectors.toList()); 如果您使用的是Java 7及更低版本,则可以使用copy.removeAll(Collections.singleton(null));
  3. 这是第一个结果:

    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());
    

答案 1 :(得分: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)));
        }