Метод put из hashMap перезаписывает значения уже сохраненных данных - PullRequest
0 голосов
/ 14 декабря 2018

Я использую hashMap для хранения данных (сведений о сертификате), которые считываются из файла.Ключ и значение сохраняются в hashMap, но после вызова метода put значения ALL имеют значение последней добавленной записи.Я думаю, это также связано с тем, что hashmap.get () возвращает неправильные значения, даже если они все верны на карте , но я не вижу своей ошибки:

HashMap<String, String[]> certDataMap = new HashMap<String, String[]>();
    String line="";
    String bankName = "", validTill = "", fingerPrint = "";
    File certDat = new File(certDataFile);
    int cntEntries=0;
    String[] data = {"dummy", "dummy"};

    if (certDat.exists()) {
        try {
            Scanner scanner = new Scanner(certDat);
            while (scanner.hasNextLine()) {
                line=scanner.nextLine();
                bankName=line.split("\\|")[0];
                validTill=line.split("\\|")[1];
                fingerPrint=line.split("\\|")[2];
                logger.debug("line: {} bankName: {} validTill: {} fingerPrint: {}",line, bankName, validTill, fingerPrint);
                data[0]=validTill;
                data[1]=fingerPrint;
                certDataMap.put(bankName, data);
                debugCertMap();
                cntEntries++;
            }
            scanner.close();
            logger.debug("{} read from {}", cntEntries, certDataFile);
        } catch (IOException e) {
            logger.error(certDataFile,e);
        }
    } else
        logger.error(certDataFile+" not found! New file will be created if certificates were downloaded");

Проблемабыло объявление данных строкового массива вне цикла, как упоминал Джонатан:

        while (scanner.hasNextLine()) {
            line=scanner.nextLine();
            bankName=line.split("\\|")[0];
            validTill=line.split("\\|")[1];
            fingerPrint=line.split("\\|")[2];
            logger.debug("line: {} bankName: {} validTill: {} fingerPrint: {}",line, bankName, validTill, fingerPrint);
            String[] data = {validTill, fingerPrint};
            certDataMap.put(bankName, data);
            debugCertMap();
            cntEntries++;

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Да, вы используете тот же объект String[] data = {"dummy", "dummy"};, где data - это ссылка на массив.

Но посмотрите на свой код.Все это можно сделать очень просто и избежать этих проблем.

Создайте класс держателя данных, представляющий одну строку из файла:

public static final class Data {

    private final String bankName;
    private final String validTill;
    private final String fingerPrint;

    public Data(String[] line) {
        bankName = line[0];
        validTill = line[1];
        fingerPrint = line[2];
    }
}

И предоставьте метод, который принимает Path иполучить содержимое файла в необходимом формате:

public static Map<String, Data> read(Path path) throws IOException {
    return Files.lines(path)
                .map(line -> new Data(line.split("\\|")))
                .collect(Collectors.toMap(Data::getBankName, Function.identity()));
}

Вот и все!

0 голосов
/ 14 декабря 2018

Объект на самом деле является ссылкой, и вы используете одни и те же данные объекта для каждой строки.Используйте новый объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...