Сортировка слов в текстовом файле по частоте - PullRequest
0 голосов
/ 27 января 2020

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

Это код:

publi c stati c void main (String [] args) создает исключение FileNotFoundException, IOException {

Map<String, Integer> fileReaderMap = new HashMap<>();

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
    String[] words = line.split(" ");
    for (int i = 0; i < words.length; i++) {
        if (!fileReaderMap.containsKey(words[i])) {
        fileReaderMap.put(words[i], 1);
        } else {
        int newValue = fileReaderMap.get(words[i]) + 1;
        fileReaderMap.put(words[i], newValue);
        }
    }
    sb.append(System.lineSeparator());
    line = br.readLine();
    }
}

Ответы [ 2 ]

1 голос
/ 27 января 2020

Сначала используйте карту для подсчета появления слов. А затем поместите записи вашей карты в список и отсортируйте ее, используя Collections.sort () и компаратор. Чем вы можете просто распечатать отсортированный список:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Snippet {

    public static void main(String[] args) throws FileNotFoundException, IOException {

    Map<String, Integer> fileReaderMap = new HashMap<>();

    try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
        String[] words = line.split(" ");
        for (int i = 0; i < words.length; i++) {
            if (!fileReaderMap.containsKey(words[i])) {
            fileReaderMap.put(words[i], 1);
            } else {
            int newValue = fileReaderMap.get(words[i]) + 1;
            fileReaderMap.put(words[i], newValue);
            }
        }
        sb.append(System.lineSeparator());
        line = br.readLine();
        }
    }
    List<Entry<String, Integer>> sorted = new ArrayList<>(fileReaderMap.entrySet());
    Collections.sort(sorted, new Comparator<Entry<String, Integer>>() {
        @Override
        public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
        int comp = Integer.compare(o1.getValue(), o2.getValue());
        if (comp != 0) {
            return comp;
        }
        return o1.getKey().compareTo(o2.getKey());
        }
    });

    for (Entry<String, Integer> entry : sorted) {
        System.out.println("Ord: " + entry.getKey() + "\t Antal Gånger: " + entry.getValue());
    }
    }
}
0 голосов
/ 27 января 2020

TreeMap сортирует по ключу. То, что вы хотите сделать, это отсортировать на основе стоимости. Вы можете создать class скажем, Частоту, имеющую поля как String word и int freq. Затем вы можете перебрать hashmap и сохранить эти ключи и значения в соответствующих полях этого класса. Обходом вы можете создать ArrayList of Frequency, а с помощью Comparable/Comparator вы можете сортировать на основе 'freq`.

...