Java 如何从哈希表向LinkedList添加元素并对其排序?
我目前正在编写一个单词计数器程序,它将使用Java 如何从哈希表向LinkedList添加元素并对其排序?,java,sorting,linked-list,hashtable,Java,Sorting,Linked List,Hashtable,我目前正在编写一个单词计数器程序,它将使用哈希表对文件中的单词进行计数,我想在程序中创建一个链表,以按降序排序单词的出现 我知道如何将元素添加到链表中,但我不知道如何将哈希表中的元素添加到链表中,并按降序对值进行排序。你能帮忙吗 以下是我目前掌握的代码: import java.io.FileReader; import java.util.*; import java.util.Hashtable; import java.util.stream.Collectors; import java
哈希表
对文件中的单词进行计数,我想在程序中创建一个链表,以按降序排序单词的出现
我知道如何将元素添加到链表中,但我不知道如何将哈希表中的元素添加到链表中,并按降序对值进行排序。你能帮忙吗
以下是我目前掌握的代码:
import java.io.FileReader;
import java.util.*;
import java.util.Hashtable;
import java.util.stream.Collectors;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class WordCounter {
public Hashtable count_words(String contents) {
Hashtable < String, Integer > count = new Hashtable < String, Integer > ();
Set < String > key = count.keySet();
StringTokenizer w = new StringTokenizer(contents);
while (w.hasMoreTokens()) {
String word = w.nextToken();
word = word.toLowerCase();
word = word.replaceAll("[-+.^:(\"),']", "");
if (count.containsKey(word)) {
count.put(word, count.get(word) + 1);
} else {
count.put(word, 1);
}
}
return count;
}
public LinkedList top20(Hashtable count) {
///I don't know how to add elements from hashtable to linkedlist
return new LinkedList();
}
public static void main(String args[]) {
try {
String contents = "";
Scanner in = new Scanner(new FileReader("src/ADayInTheLife.txt"));
while ( in .hasNextLine()) {
contents += in .nextLine() + "\n";
}
WordCounter wc = new WordCounter();
Hashtable count = wc.count_words(contents);
System.out.println(count);
} catch (Exception e) {
System.err.println("Error " + e.getMessage());
}
}
}
导入java.io.FileReader;
导入java.util.*;
导入java.util.Hashtable;
导入java.util.stream.collector;
导入java.util.Collections;
导入java.util.LinkedList;
导入java.util.List;
公共类字计数器{
公共哈希表计数\u字(字符串内容){
Hashtablecount=新的Hashtable();
Setkey=count.keySet();
StringTokenizer w=新的StringTokenizer(内容);
while(w.hasMoreTokens()){
字符串字=w.nextToken();
word=word.toLowerCase();
word=word.replaceAll(“[-+.^:(\”,“]),”;
if(count.containsKey(word)){
count.put(单词,count.get(单词)+1);
}否则{
数一数(字,1);
}
}
返回计数;
}
公共链接列表top20(哈希表计数){
///我不知道如何将哈希表中的元素添加到linkedlist
返回新的LinkedList();
}
公共静态void main(字符串参数[]){
试一试{
字符串内容=”;
Scanner in=new Scanner(新文件读取器(“src/ADayInTheLife.txt”);
while(在.hasNextLine()中){
contents+=in.nextLine()+“\n”;
}
WordCounter wc=新的WordCounter();
哈希表计数=wc.count\u单词(内容);
系统输出打印项次(计数);
}捕获(例外e){
System.err.println(“Error”+e.getMessage());
}
}
}
以下是高级步骤
1) 定义具有属性word和count的LinkNode,并将对LinkNode的自引用定义为下一个
2) 定义一个方法,该方法将返回对LinkNode头部的引用
3) 在方法中,迭代哈希表并执行以下活动
a) 如果链接列表为空
创建一个具有word和count值的链接节点,并将其指定为链接列表的标题
b) 否则
您需要找到插入新节点的位置(遍历节点并将计数与列表中的节点进行比较,以根据您的顺序进行决定)
3) 您可以返回构造的头部节点以下是高级步骤
1) 定义具有属性word和count的LinkNode,并将对LinkNode的自引用定义为下一个
2) 定义一个方法,该方法将返回对LinkNode头部的引用
3) 在方法中,迭代哈希表并执行以下活动
a) 如果链接列表为空
创建一个具有word和count值的链接节点,并将其指定为链接列表的标题
b) 否则
您需要找到插入新节点的位置(遍历节点并将计数与列表中的节点进行比较,以根据您的顺序进行决定)
3) 您可以返回构造的头节点一种可能的解决方案是使用lambda,在本例中,不需要从哈希转换为LinkedList,只需使用哈希对前20个节点进行排序并按相反顺序列出:
尝试以下方法:
Hashtable<String,Integer> count = wc.count_words(contents);
count.entrySet().stream().sorted(Map.Entry.<String,Integer> comparingByValue().reversed()).limit(20).forEach(System.out::println);
Hashtable count=wc.count\u单词(内容);
count.entrySet().stream().sorted(Map.Entry.comparingByValue().reversed()).limit(20.forEach(System.out::println);
一种可能的解决方案是使用lambda,在本例中,不需要将哈希转换为LinkedList,只需使用哈希对前20个进行排序并按相反顺序列出:
尝试以下方法:
Hashtable<String,Integer> count = wc.count_words(contents);
count.entrySet().stream().sorted(Map.Entry.<String,Integer> comparingByValue().reversed()).limit(20).forEach(System.out::println);
Hashtable count=wc.count\u单词(内容);
count.entrySet().stream().sorted(Map.Entry.comparingByValue().reversed()).limit(20.forEach(System.out::println);
使用ArrayList
更有意义,因为您已经知道有多少项,并且可以使用Collections.sort()
对其进行排序。使用ArrayList
更有意义,因为您已经知道有多少项,并且可以使用Collections.sort()
对其进行排序。