如何从 java 中的 bufferedreader 读取&运行 多个变量?
How to read&Run Multiple variables from bufferedreader in java?
之前我有这两个变量 (a),(total) 在两个不同的 class 但我无法获得 class.
的属性
所以,
我试着把这两个代码放在一个单一的 class
但没有一个变量起作用
System.out.println("( "+file1.getName() +" )-" +" Total no of words=" + a +"Total repeated words counted:"+total);
两者都不工作:
我目前的样本输出:
(博客39.txt)-重复单词总数counted:4,总字数words:0
都没有
(博客39.txt)-重复单词总数counted:0,总字数words:82
我需要的输出是:
(博客39.txt)-重复单词总数counted:4,总字数words:82
当我 运行 时,"a" 或 "total" 都不起作用。(反之亦然)如果我更改代码(可变)顺序。
谁能告诉我应该如何获得两个变量输出??
:)
我是 java
的初学者
下面是我的代码。
package ramki;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
public class newrepeatedcount {
public static void main(String[] args) {
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
};
File folder = new File("E:\testfolder\");
File[] listOfFiles = folder.listFiles(filter);
for (int i = 0; i < listOfFiles.length; i++) {
File file1 = listOfFiles[i];
BufferedReader ins = null;
try {
ins = new BufferedReader(
new InputStreamReader(new FileInputStream(file1)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String line = "", str = "";
String st = null;
try {
st = IOUtils.toString(ins);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// split text to array of words
String[] words = st.split("\s");
// frequency array
int[] fr = new int[words.length];
// init frequency array
for (int i1 = 0; i1 < fr.length; i1++)
fr[i1] = -1;
// count words frequency
for (int i1 = 0; i1 < words.length; i1++) {
for (int j = 0; j < words.length; j++) {
if (words[i1].equals(words[j])) {
fr[i1]++;
}
}
}
// clean duplicates
for (int i1 = 0; i1 < words.length; i1++) {
for (int j = 0; j < words.length; j++) {
if (words[i1].equals(words[j])) {
if (i1 != j)
words[i1] = "";
}
}
}
int a = 0;
try {
while ((line = ins.readLine()) != null) {
str += line + " ";
}
} catch (IOException e) {
e.printStackTrace();
}
StringTokenizer st1 = new StringTokenizer(str);
while (st1.hasMoreTokens()) {
String s = st1.nextToken();
a++;
}
int total = 0;
for (int i1 = 0; i1 < words.length; i1++) {
if (words[i1] != "") {
// System.out.println(words[i1]+"="+fr[i1]);
total += fr[i1];
}
}
System.out.println("( " + file1.getName() + " )-"
+ "Total repeated words counted:" + total + ","
+ "total no of words:" + a);
// System.out.println("total no of words:"+a);
}
}
}
如果您读完一个流,您将无法继续阅读。
由于您的代码在很多方面都没有优化,我可以建议一种快速而肮脏的方法来使您的代码正常工作。在重新计算 "a" 的值之前,只需初始化分配给变量 "ins" 的 BufferedReader。
...
try {
ins = new BufferedReader ( new InputStreamReader(new FileInputStream(file1)));
while ((line = ins.readLine()) != null) {
str += line + " ";
}
} catch (IOException e) {
e.printStackTrace();
}
...
每当你有这样的数据处理时,Java8's StreamAPI很可能是最好的选择。
// get all the files under this folder
Files.walk(Paths.get("E:\testfolder\"))
// keep all the files ending in .txt
.filter(p -> p.toString().toLowerCase().endsWith(".txt"))
.forEach(p -> {
try {
// process all the lines of the file.
Map<String, Long> wordCount = Files.lines(p)
// break the lines into words
.flatMap(l -> Stream.of(l.split("\s")))
// collect the words and count them
.collect(Collectors.groupingBy(w -> w, Collectors.counting()));
// find how many values are more than 1
long wordDuplicates = wordCount.values().stream().filter(l -> l > 1).count();
// get the sum of all the values.
long totalWords = wordCount.values().stream().mapToLong(l -> l).sum();
System.out.println(p + " has " + wordDuplicates + " duplicates and " + totalWords + " words");
// catch the IOException at the end because you can't do anything more with the file if this happens.
} catch (IOException e) {
e.printStackTrace();
}
});
我不确定这是否是最佳解决方案,但这会给你一个集合或地图(在内部你可以转换它在你的文本中出现的次数。然后你可以根据你的要求使用它。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class NewRepeatedCount {
public static void main(String... arg0)
{
BufferedReader br = null;
Map<String, Integer> counterMap = new HashMap<String, Integer>();
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("C:\testing.txt"));
while ((sCurrentLine = br.readLine()) != null) {
String[] words = sCurrentLine.split("\s");
for(String word : words)
{
int count = 1;
if(counterMap.get(word) != null)
{
count = counterMap.get(word);
count++;
counterMap.put(word, count);
}else{
counterMap.put(word, count);
}
}
}
System.out.println(counterMap.entrySet());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
之前我有这两个变量 (a),(total) 在两个不同的 class 但我无法获得 class.
的属性所以,
我试着把这两个代码放在一个单一的 class
但没有一个变量起作用
System.out.println("( "+file1.getName() +" )-" +" Total no of words=" + a +"Total repeated words counted:"+total);
两者都不工作:
我目前的样本输出:
(博客39.txt)-重复单词总数counted:4,总字数words:0
都没有
(博客39.txt)-重复单词总数counted:0,总字数words:82
我需要的输出是:
(博客39.txt)-重复单词总数counted:4,总字数words:82
当我 运行 时,"a" 或 "total" 都不起作用。(反之亦然)如果我更改代码(可变)顺序。
谁能告诉我应该如何获得两个变量输出?? :) 我是 java
的初学者下面是我的代码。
package ramki;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
public class newrepeatedcount {
public static void main(String[] args) {
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
};
File folder = new File("E:\testfolder\");
File[] listOfFiles = folder.listFiles(filter);
for (int i = 0; i < listOfFiles.length; i++) {
File file1 = listOfFiles[i];
BufferedReader ins = null;
try {
ins = new BufferedReader(
new InputStreamReader(new FileInputStream(file1)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String line = "", str = "";
String st = null;
try {
st = IOUtils.toString(ins);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// split text to array of words
String[] words = st.split("\s");
// frequency array
int[] fr = new int[words.length];
// init frequency array
for (int i1 = 0; i1 < fr.length; i1++)
fr[i1] = -1;
// count words frequency
for (int i1 = 0; i1 < words.length; i1++) {
for (int j = 0; j < words.length; j++) {
if (words[i1].equals(words[j])) {
fr[i1]++;
}
}
}
// clean duplicates
for (int i1 = 0; i1 < words.length; i1++) {
for (int j = 0; j < words.length; j++) {
if (words[i1].equals(words[j])) {
if (i1 != j)
words[i1] = "";
}
}
}
int a = 0;
try {
while ((line = ins.readLine()) != null) {
str += line + " ";
}
} catch (IOException e) {
e.printStackTrace();
}
StringTokenizer st1 = new StringTokenizer(str);
while (st1.hasMoreTokens()) {
String s = st1.nextToken();
a++;
}
int total = 0;
for (int i1 = 0; i1 < words.length; i1++) {
if (words[i1] != "") {
// System.out.println(words[i1]+"="+fr[i1]);
total += fr[i1];
}
}
System.out.println("( " + file1.getName() + " )-"
+ "Total repeated words counted:" + total + ","
+ "total no of words:" + a);
// System.out.println("total no of words:"+a);
}
}
}
如果您读完一个流,您将无法继续阅读。 由于您的代码在很多方面都没有优化,我可以建议一种快速而肮脏的方法来使您的代码正常工作。在重新计算 "a" 的值之前,只需初始化分配给变量 "ins" 的 BufferedReader。
...
try {
ins = new BufferedReader ( new InputStreamReader(new FileInputStream(file1)));
while ((line = ins.readLine()) != null) {
str += line + " ";
}
} catch (IOException e) {
e.printStackTrace();
}
...
每当你有这样的数据处理时,Java8's StreamAPI很可能是最好的选择。
// get all the files under this folder
Files.walk(Paths.get("E:\testfolder\"))
// keep all the files ending in .txt
.filter(p -> p.toString().toLowerCase().endsWith(".txt"))
.forEach(p -> {
try {
// process all the lines of the file.
Map<String, Long> wordCount = Files.lines(p)
// break the lines into words
.flatMap(l -> Stream.of(l.split("\s")))
// collect the words and count them
.collect(Collectors.groupingBy(w -> w, Collectors.counting()));
// find how many values are more than 1
long wordDuplicates = wordCount.values().stream().filter(l -> l > 1).count();
// get the sum of all the values.
long totalWords = wordCount.values().stream().mapToLong(l -> l).sum();
System.out.println(p + " has " + wordDuplicates + " duplicates and " + totalWords + " words");
// catch the IOException at the end because you can't do anything more with the file if this happens.
} catch (IOException e) {
e.printStackTrace();
}
});
我不确定这是否是最佳解决方案,但这会给你一个集合或地图(在内部你可以转换它在你的文本中出现的次数。然后你可以根据你的要求使用它。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class NewRepeatedCount {
public static void main(String... arg0)
{
BufferedReader br = null;
Map<String, Integer> counterMap = new HashMap<String, Integer>();
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("C:\testing.txt"));
while ((sCurrentLine = br.readLine()) != null) {
String[] words = sCurrentLine.split("\s");
for(String word : words)
{
int count = 1;
if(counterMap.get(word) != null)
{
count = counterMap.get(word);
count++;
counterMap.put(word, count);
}else{
counterMap.put(word, count);
}
}
}
System.out.println(counterMap.entrySet());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}