Я читаю CSV и сохраняю данные в объекты (объект создается для каждой строки). Строки в CSV сгруппированы по первому элементу (номер группы) - где-то между 2-10 строками есть общий номер группы. В наборе данных ~ 180 групп. Чтобы упростить обработку этих данных, я сохраняю данные в HashMaps, где ключ — это номер группы, а значение, привязанное к ключу, — это ArrayList объектов данных.
Когда я перебираю строки CSV, я добавляю объекты в HashMap, используя номер группы строк, чтобы указать, куда поместить новый объект данных. Если у объекта есть номер группы, который еще не был введен в CSV, он создает новый ключ (его номер группы) и список объектов данных ArrayList, содержащий только себя.
Если номер группы строки ЯВЛЯЕТСЯ ключом в HashMap, он получает ArrayList, привязанный к номеру группы, добавляет к нему новый объект данных и использует функцию put для повторного добавления новой записи с обновленным ArrayList (теперь с еще одна запись данных, привязанная к общему номеру группы).
Пример кода:
ArrayList<CSVData> csvListNew = new ArrayList<CSVData>();
HashMap<Integer,ArrayList<CSVData>> CSVDataMapNew = new HashMap<Integer,ArrayList<CSVData>>();
while ((line = reader.readLine()) != null && !(line.contains(",,,,,,,,,")))
{
System.out.println(line);
String[] csvDataNew = line.split(",");
String currentGroup = csvDataNew[GroupIndex];
try {
currentGroupNumber = Integer.parseInt(currentGroup.replace("group", "").replace(" ", ""));
} catch (Exception ex) {
currentGroupNumber = previousGroupNumber;
}
String path = csvDataNew[PathIndex];
startLine = Integer.parseInt(csvDataNew[StartLineIndex]);
endLine = Integer.parseInt(csvDataNew[EndLineIndex]);
CSVData data = new CSVData(currentGroupNumber, path, startLine, endLine);
if (CSVDataMapNew.containsKey(currentGroupNumber)) { //if it does contain the current key, add the current object to the ArrayList tied to it.
csvListNew = CSVDataMapNew.get(currentGroupNumber);
csvListNew.add(clone);
CSVDataMapNew.put(currentGroupNumber, csvListNew);
} else { //if it doesnt contain the current key, make new entry
csvListNew.add(clone);
CSVDataMapNew.put(currentGroupNumber, csvListNew);
System.out.println(CSVDataMapNew.size());
System.out.println(CSVDataMapNew.get(currentGroupNumber).size());
}
csvListNew.clear(); //to make sure no excess objects are entered into the map.
previousGroupNumber = currentGroupNumber;
}
Существуют соответствующие попытки перехвата и т. д., а CSVDataTable объявлен в своем собственном классе, на который ссылаются статически.
Проблема в том, что когда я добавляю операторы печати на каждом этапе, каждый ArrayList в HashMap стирается в конце каждого цикла. Таким образом, как только CSV завершается, он имеет значение каждого ключа, но все ArrayLists, привязанные к каждому ключу, пусты. (Доказано последующим циклическим просмотром HashMap).
Как я могу решить эту проблему, поэтому, когда я ввожу значение в ArrayList и повторно «помещаю» ключ и обновленный ArrayList в карту, он сохраняет свои данные?