ArrayList 的列表在不应该更改的时候被更改

List of ArrayList being altered when it's not supposed to

(kb 是数组列表的列表)

我目前正在尝试将 kb.get(i) 中的元素添加到数组列表路径中,尽管它们也被添加到 kb 中找到的第一个数组列表中,而这并不是我想要的。

kb 的初始化方式:

List<ArrayList<String>> kb = new ArrayList<>();
while (scanLines.hasNextLine()) { 
            edge = new ArrayList<>(Arrays.asList(scanLines.nextLine().split(" ")));
            System.out.println(edge);
            kb.add(edge);
        }

路径的初始化方式:

List<ArrayList<String>> allPaths = new ArrayList<>();
for (ArrayList<String> line : kb) {
        if (querySubConcept.equals(line.get(0))) { //Adding all edges which have the query's sub-concept
            allPaths.add(line);
        }
    }

问题出在这里

if (!checker) {
   if (!path.get(path.size() - 2).equals("IS-NOT-A") || 
          !querySuperConcept.equals(superConcept)) {
                path.add(kb.get(i).get(1));
                path.add(kb.get(i).get(2));
                superConcept = kb.get(i).get(2);

                if (querySuperConcept.equals(superConcept))
                    break;
    }
}

问题: 您正在添加现有 ArrayList 的引用。

解决方法:你需要添加一份ArrayList.

按如下操作:

for (ArrayList<String> line : kb) {
    if (querySubConcept.equals(line.get(0))) { //Adding all edges which have the query's sub-concept
        allPaths.add(new ArrayList<>(line));
    }
}