尝试创建哈希表以从文本文件中获取数组列表 - 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();
}
}
我正在尝试创建一个哈希表以从我的文本文件中读取 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();
}
}