Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从哈希表向LinkedList添加元素并对其排序?_Java_Sorting_Linked List_Hashtable - Fatal编程技术网

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()
对其进行排序。