Java 按频率对文本文件中的单词进行排序
我创建了一个程序,它计算文本文档中不同单词的数量,然后将它们打印到控制台。我想添加到程序中的是,单词应该按最高频率排序。我肯定这没什么大不了的,但我不知道该怎么办 代码如下: public static void mainString[]args引发FileNotFoundException、IOException{Java 按频率对文本文件中的单词进行排序,java,eclipse,sorting,bufferedreader,filereader,Java,Eclipse,Sorting,Bufferedreader,Filereader,我创建了一个程序,它计算文本文档中不同单词的数量,然后将它们打印到控制台。我想添加到程序中的是,单词应该按最高频率排序。我肯定这没什么大不了的,但我不知道该怎么办 代码如下: public static void mainString[]args引发FileNotFoundException、IOException{ Map<String, Integer> fileReaderMap = new HashMap<>(); try (BufferedReader br
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();
}
}
TreeMap根据键进行排序。你要做的是根据值进行排序。你可以创建一个类,比如说Frequency,包含字符串字和int freq等字段。然后你可以迭代hashmap并将这些键和值存储在这个类各自的字段中。通过遍历,你可以创建一个频率的ArrayList,并使用Comparitable/Comparator您可以根据“freq”进行排序。首先使用映射计算单词的外观。然后将映射的条目放入列表中,并使用Collections.sort和Comparator对其进行排序。然后您可以只打印排序后的列表:
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());
}
}
}
我从中得到的只是空值。entry.getValue返回以下错误消息:映射上getObject的参数类型不太可能为Integer。这是为什么?抱歉,System.out.println中的最后一个变量错误。我更改了它。