Список ArrayList, изменяемый, когда он не должен - PullRequest
0 голосов
/ 22 апреля 2020

(kb - это список arraylists)

В настоящее время я пытаюсь добавить элементы из kb.get (i) в путь к arraylist, хотя они также добавляются к первому массиву, найденному в 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;
    }
}

1 Ответ

1 голос
/ 22 апреля 2020

Проблема: Вы добавляете ссылку на существующий 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));
    }
}
...