Java-сканер для чтения частоты символов из файла - PullRequest
0 голосов
/ 31 мая 2019

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

public static Huffman build(String filePath) throws IOException {
    if (filePath == null) {
        throw new NullPointerException("File doesn't exist");
    } else {
        try {
            Scanner file = new Scanner(new File(filePath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        while (file.hasNextLine()) {
            Scanner s2 = new Scanner(file.nextLine());
            while (s2.hasNext()) {
                String s = s2.next();
                System.out.println(s);
            }
        }
    }
}

Ответы [ 3 ]

1 голос
/ 31 мая 2019

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

Просто просмотрите весь массив символов файла. Поместите все в приоритетную очередь. Чтобы получить частоту, просто вытолкните pqueue и сохраните его на карте или в чем-то подобном, или выведите его туда, куда вам нужно вывести его.

Карта намного лучше, но если вам нужно использовать приоритетную очередь, она относительно проста

0 голосов
/ 01 июня 2019

Ну, это альтернативное решение, если вы не хотите использовать HasMap или PriorityQueue. Вы можете использовать простой частотный массив целых чисел для хранения no. появления всех букв. Я использовал массив целых чисел размером 128, чтобы покрыть все типы символов, включая прописные, строчные, специальные символы или цифры. (Вы можете добавить этот фрагмент кода сразу после сохранения ввода пользователя в String s)

    int[] count = new int[128]; // initially they all will be zero
    for(char ch:s.toCharArray()){
        count[ch]++;
    }
    for(int i=0;i<128;i++){
        if(count[i]!=0){
            System.out.println((char)i+":"+count[i]);
        }
    }
0 голосов
/ 01 июня 2019

Я бы рекомендовал использовать простую карту вместо приоритетной очереди.Используя Files.lines() и Java Stream, вы можете использовать это:

public static Map<String, Long> build(String filePath) throws IOException {
    if (filePath == null) {
        throw new NullPointerException("File doesn't exist");
    }
    try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
        return lines.map(s -> s.split("")).flatMap(Arrays::stream)
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    }
}

Если вам нужен порядок символов, вы можете использовать LinkedHashMap, который остается в порядке вставки.Измените сборщик моего примера выше на:

Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())
...