尝试创建哈希表以从文本文件中获取数组列表 - Java

Trying to create a hashtable to get an arraylist from the text file - Java

我正在尝试创建一个哈希表以从我的文本文件中读取 ArrayList,然后将其计入另一个文本文件。我应该标记每个单词并通过计算它们来获取键和值。到目前为止,我还处于开始阶段,我没有弄清楚我的代码有什么问题,似乎没有错误,但它没有连接到文本并获得 ArrayList 或者只是我的代码错误.我将不胜感激任何帮助。谢谢。

这是地图文件


public class Map {
    public static String fileName= "C:Users\ruken\OneDrive\Desktop\workshop.txt";

    private ArrayList<String> arr = new ArrayList<String>();
    public ArrayList <String>getList () {
        return this.arr;
    }

    private Hashtable<String, Integer> map = new Hashtable<String, Integer>();

    public void load(String path) {
        try{
            FileReader f2 = new FileReader("C:Users\ruken\OneDrive\Desktop\workshop.txt");
            Scanner s = new Scanner(f2);
            while (s.hasNextLine()) {
                String line = s.nextLine();
                String[] words = line.split("\s");
                for (int i=0;i<words.length; i++){
                    String word = words[i];
                    if (! word.isEmpty()){
                        System.out.println(word);
                        arr.add(word);
                    }
                }
            }
            f2.close();
            System.out.println("An error occurred");
        }
        catch(IOException ex1)
        {
            Collections.sort(arr);
            System.out.println("An error occurred.");
            for (String counter: arr) {
                System.out.println(counter);
            }
            ex1.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Map m =new Map();
        m.load("C:Users\ruken\OneDrive\Desktop\out.txt");
    }


    public Object get(String word) {
        return null;
    }

    public void put(String word, int i) {

    }


}

这是 Reduce 文件

package com.company;

import java.io.*;
import java.util.*;

public class Reduce {

    private Hashtable<String, Integer> map=new Hashtable< String, Integer>();

    public Hashtable < String, Integer> getHashTable () {
        return map;
    }

    public void setHashTable ( Hashtable < String, Integer> map){
        this.map =map;
    }

    public void findMin () {

    }

    public void findMax() {

    }

    public void sort (ArrayList<String> arr) throws IOException {
        Collections.sort(arr);
        Iterator it1 = arr.iterator();
        while (it1.hasNext()) {
            String word = it1.next().toString();
            System.out.println(word);

        }
    }
    //constructors
    public void reduce (ArrayList<String> words) {
        Iterator<String> it1 =words.iterator();
        while (it1.hasNext()) {
            String word=it1.next();
            System.out.println (word);
            if (map.containsKey(word)) {
                map.put(word, 1);
            }
            else {
                int count = map.get(word);
                map.put(word, count+1);
            }

            System.out.println( map.containsValue(word));


            }
        }


    }

这是workshop.txt的一部分。是基本的简单文字

” 致谢

我要感谢 Carl Fleischhauer 和 Prosser Gifford 有机会了解人类 activity 我鲜为人知的领域 十个月前,David and Lucile Packard Foundation 支持那个机会。他人给予的帮助被承认于 一个单独的页面。

                                                      19 October 1992


           ***   ***   ***   ******   ***   ***   ***


                          INTRODUCTION

电子文本研讨会(一)汇集了来自 各种项目和兴趣小组来比较想法,信念, 经验,尤其是放置和呈现的方法 计算机化形式的历史文本材料。大多数与会者获得 从事件中获得很多见解和展望。但是大会没有 形成一个新的国家,或者换句话说,项目的多样性 利益太大,无法将代表们拉成一个有凝聚力的, action-oriented body.(2)"

计算文本中的词频可以使用 java stream API

这是我的实现,后面是解释性注释。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class WordFreq {

    public static void main(String[] args) {
        Path path = Paths.get("workshop.txt");
        Function<String, String> keyMapper = Function.identity();
        Function<String, Integer> valueMapper = (word) -> Integer.valueOf(1);
        BinaryOperator<Integer> mergeFunction = (a, b) -> Integer.valueOf(a.intValue() + b.intValue());
        Supplier<Hashtable<String, Integer>> mapSupplier = () -> new Hashtable<>();
        try {
            Map<String, Integer> map = Files.lines(path)
                 .flatMap(line -> Arrays.stream(line.split("\b")))
                 .filter(word -> word.matches("^\w+$"))
                 .map(word -> word.toLowerCase())
                 .collect(Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapSupplier));
            BiConsumer<String, Integer> action = (k, v) -> System.out.printf("%3d %s%n", v, k);
            map.forEach(action);
        }
        catch (IOException xIo) {
            xIo.printStackTrace();
        }
    }
}
  • class java.nio.file.Files 中的方法 lines() 在文件中创建文本行流。在这种情况下,该文件是您的 workshop.txt 文件。
  • 对于读取的文件的每一行,我使用 class java.lang.String 中的方法 split() 将其拆分为单词,并转换方法 split() 返回的数组进入另一个流。
  • 实际上,每行文本在每个单词边界处被拆分,因此方法 split() returns 的单词数组可能包含不是真正单词的字符串。因此,我过滤 "words" 以仅提取真实的单词。
  • 然后我将每个单词转换为小写,以便我的最终地图不区分大小写。换句话说,单词 The 和单词 the 将被视为同一个单词。
  • 最后,我创建了一个 Map,其中映射键是文件 workshop.txt 文本中的一个不同单词,映射值是一个 Integer,即出现的次数文中的那个词。

既然你规定Map必须是一个Hashtable,我明确创建了一个Hashtable来存储流上collect操作的结果。

上面代码的最后一部分显示了Hashtable.

的内容

我整理了第一部分,"Map"如下,现在我有一个按字母顺序排列的数组。 如下..现在我应该计算标记化的键值。 “.. 然而 然而 然而 然而 然而 屈服了 你 年轻 热情 零。 缩放 ..."

package com.company;


        import java.io.FileReader;
        import java.io.IOException;
        import java.util.*;
        import java.util.Collections;

public class Map {

    public static String fileName= "C:\Users\ruken\OneDrive\Desktop\workshop.txt";



    private ArrayList<String> arr = new ArrayList<String>();
    public ArrayList <String>getList () {
        return this.arr;
    }

    private Hashtable<String, Integer> map = new Hashtable<String, Integer>();

    public void load() {



        try{
            FileReader f2 = new FileReader("C:\Users\ruken\OneDrive\Desktop\workshop.txt");

            Scanner s = new Scanner(f2);
            while (s.hasNextLine()) {
                String line = s.nextLine();
                String[] words = line.split("\s");
                for (int i=0;i<words.length; i++){
                    String word = words[i];
                    if (! word.isEmpty()){
                        System.out.println(word);
                        arr.add(word);
                    }
                }
            }
            f2.close();
            System.out.println();


    }
            catch(IOException ex1){
                System.out.println("An error occurred.");
             ex1.printStackTrace(); }
        {
            Collections.sort(arr);
            System.out.println("Sorted.");
            for (String counter: arr) {
                System.out.println(counter);
            }

        }

    }

    public static void main(String[] args) {
        Map m =new Map();
        m.load();
    }
}

进行减少的第二部分是:


package com.company;


import java.io.*;
import java.util.*;
import java.io.FileWriter;
import java.io.IOException;

public class Reduce {

    private Hashtable<String, Integer> map = new Hashtable<String, Integer>();


    public Hashtable<String, Integer> getHashTable() {
        return map;
    }

    public void setHashTable(Hashtable<String, Integer> map) {
        this.map = map;
    }


    //constructors
    public void reduce (ArrayList<String> arr) {
        Iterator<String> it1 = arr.iterator();
        while (it1.hasNext()) {
            String word = it1.next();
            System.out.println(word);
            if (map.containsKey(word)) {
                int a = (int) map.get(word);
                a++;
                map.put(word, a);
            } else {
                map.put(word, 1);
            }
        }
    }



    public void write () {

        try {
            FileWriter f1 = new FileWriter("C:\Users\ruken\OneDrive\Desktop\output.txt");
            Iterator<String> it1 = map.keySet().iterator();
            while (it1.hasNext()) {
                String word = it1.next().toString();
                f1.write(word + "" + ":" + "" + map.get(word) + "\n" );
            }
            f1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args)  {

        Map m =new Map();
        m.load();
        Reduce r = new Reduce ();
        ArrayList<String> arr=  m.getList();
        r.reduce(arr);
        r.write();
    }
}