在java中从列表中删除子列表时出现问题

在java中从列表中删除子列表时出现问题,java,arraylist,Java,Arraylist,我有一个类似java的函数 void remove(List<Var> vars, List<List<Value>> vals) { int index = calculateIndex(); vars.removeAll(vars.subList(index, vars.size())); vals.removeAll(vals.subList(index, vals.size())); void删除(列表变量、列表VAL){ i

我有一个类似java的函数

void remove(List<Var> vars, List<List<Value>> vals) {
    int index = calculateIndex();
    vars.removeAll(vars.subList(index, vars.size()));
    vals.removeAll(vals.subList(index, vals.size()));
void删除(列表变量、列表VAL){
int index=calculateIndex();
vars.removeAll(vars.subList(index,vars.size());
vals.removeAll(vals.subList(index,vals.size());
}


在输入方法之前,两个列表的元素数总是相同的,但是,在删除所有变量后,它们比VAL多了一个元素,索引在零和列表大小之间,为什么会发生这种情况?

如果我正确理解了您试图做的事情,那么删除子列表的代码应该是这样的

int index = calculateIndex();
vars.subList(index, vars.size()).clear();
vals.subList(index, vals.size()).clear();

removeAll
不是适合此作业的工具。
removeAll
的目的是查看集合A中的所有元素,并删除集合B中与集合A中的任何元素相等的元素。我相信它使用
.equals
来确定哪些元素相等,而不是引用相等,这意味着您可能正在删除一些不打算删除的元素。此外,由于本例中的集合A将是集合B的子列表,因此它们会重叠,因此我不会指望
removeAll
能够正常工作,尽管它可能会;在这种情况下使用重叠列表可能会导致严重破坏。

作为一种替代设计,不一定是正确的,我认为如果您实际构建了一个包含差异的新列表,并返回它,同时保留原始列表,那么这将是一种更好的方法,否则会有一点代码味道

i、 e

列表差异(列表变量、列表VAL){
列表结果=新建ArrayList();
//循环遍历Var和VAL,并根据某些条件将Var适当地添加到结果中
//  ....
返回结果;
}

通过这种方式,您可以防止列表变量在作为输入参数传递给方法时出现神奇的变化。

如果您想使用
removeAll()
removeAll
,则
Var
Value
的列表应该是相同类型的。我想您需要
vars.subList(…).clear()
@brso05他没有在同一个表达式中使用
vars
vals
,因此没有“相同类型”的问题。这很难发现,因为只有一个字母不同。我想,因为我使用的是子列表
removeAll
,所以可以工作,谢谢!
List<Var> difference(List<Var> vars, List<List<Value>> vals) {
    List<Var> results = new ArrayList<Var>();

    // Loop through Vars and Vals appropriately adding Var to results based on some criteria
    //  ....

    return results;
}