HashMap содержит определенный ключ, но говорит мне, что это не так - PullRequest
0 голосов
/ 02 ноября 2018

Я писал этот код для университетской деятельности: мне нужно прочитать некоторые строки из файла .txt, сохранить их в HashMap и распечатать некоторые результаты на основе того, что было в файле. Строки - это имя и номер, которые являются именем и возрастом этого человека. Например:

Марка 23

Иоанн 32

.TXT-файлы содержат несколько имен людей, программа работает хорошо, за одним исключением: первое имя списка читается, сохраняется в HashMap, но каждый раз, когда я достигаю его с помощью map.get() или map.containsKey() он говорит мне, что ключ не существует.

Эта проблема возникает только с первым прочитанным именем. В приведенном мной примере это произойдет с Mark , но если я изменю порядок строк, чтобы сначала поставить John , это произойдет с ним, а не с Mark .

Помните, что ключ - это имя человека, а значение - это объект, которого я создаю для этого человека.

Вот мои коды:

class Person {
    private String name;
    private int age;

    //Getter
    public int getAge() {
        return this.age;
    }

    public String getName() {
        return this.name;
    }

    //Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //toString
    @Override
    public String toString() {
        return name + " " + age;
    }
}
class OpenText {
    public static void textReader(String directory) {
        try {
            BufferedReader file = new BufferedReader(new FileReader(directory));
            String line;
            String[] lineSplit;

            while ((line = file.readLine()) != null) {
                lineSplit = line.split(" ");
                try {
                    int age = Integer.parseInt(lineSplit[1]);
                    Main.hMap.put(lineSplit[0], new Person(lineSplit[0], age));

                } catch (NumberFormatException exc) {
                    System.out.println(exc);
                }
            }

            file.close();
        } catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}
public class Main {

    public static Map<String, Person> hMap = new HashMap<>();

    public static void main(String[] args) {
        OpenText.textReader("DIRECTORY OF THE FILE");
        System.out.println(hMap.keySet());
        System.out.println(hMap.values());
        System.out.println(hMap.get("John"));
    }

    // [John, Mark, Peter, Philip, Mary] 
    // [John 32, Mark 23, Peter 37, Philip 20, Mary 54] 
    // null
}

Полагаю, ясно, что я просто новичок в Java, но любое понимание будет высоко оценено!

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Я не знаю, какую версию Java вы здесь используете. я попробовал ваш код с незначительным изменением, и он работал нормально просто следите за любыми новыми пустыми строками между записями. Например, вы не должны иметь содержимое файла, как:

Марка 23

Джон 32

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

public class Main {
public static Map<String, Person> hMap = new HashMap<String, Person>();

public static void main(String[] args) {
    OpenText.textReader("C:\\Projects\\Trials\\directory\\src\\com\\hello\\nameList.txt");
    System.out.println(hMap.keySet());
    System.out.println(hMap.values());
    System.out.println(hMap.get("John"));
}

}

Я только что обновил создание HashMap до new HashMap<String, Person>();

0 голосов
/ 02 ноября 2018

Некоторые текстовые редакторы добавляют непечатаемые символы в начало файла, чтобы при чтении другим текстовым редактором он знал, какое окончание символа использовалось. например https://en.wikipedia.org/wiki/Byte_order_mark

BufferedReader не делает ничего особенного с этими символами, но вместо этого обрабатывает их как текст, который вы не видите.

В вашем случае это означает, что любое слово, которое сначала содержит слова, в начале содержит непечатаемые символы, что означает, что оно не является точным соответствием.

Для обработки произвольной спецификации вы можете использовать следующие решения.

Метка порядка следования байтов затрудняет чтение файлов в Java

Я бы просто позаботился о том, чтобы вы их не добавляли.

Более простое решение - игнорировать эти символы, если это работает для вас.

line = line.replaceAll("[\0\uFFFD]", "");

1019 * КСТАТИ *

BufferedReader br = new BufferedReader(
        new InputStreamReader(
                new ByteArrayInputStream(
                        new byte[]{(byte) 0x0, (byte) 0x0, 'H', 'i', '\n'}
                )));
String line = br.readLine();
System.out.println("line.length()=" + line.length());
System.out.println(line);

печать

line.length()=4
Hi

Вам нужно проверить, что реальная длина строки соответствует ожидаемой.

...