Java,将文件中的唯一字符对象化,并通过character对象的increment()方法计算出现次数
我正在开发一个java程序,该程序将文本文件作为输入,为每个字符创建一个“CharacterFrequency”对象,并计算每个字符的发生次数。到目前为止,我已经为building对象构建了类,该类似乎以其当前的形式起作用,但是我在主循环中的逻辑程序流方面遇到了问题。我不知道如何构造if-else-while循环等来循环字符并增加每个对象的计数 有些人要求澄清,所以让我试着用其他术语来解释Java,将文件中的唯一字符对象化,并通过character对象的increment()方法计算出现次数,java,object,text,character,Java,Object,Text,Character,我正在开发一个java程序,该程序将文本文件作为输入,为每个字符创建一个“CharacterFrequency”对象,并计算每个字符的发生次数。到目前为止,我已经为building对象构建了类,该类似乎以其当前的形式起作用,但是我在主循环中的逻辑程序流方面遇到了问题。我不知道如何构造if-else-while循环等来循环字符并增加每个对象的计数 有些人要求澄清,所以让我试着用其他术语来解释 从第一个character对象开始,如果我们在charArray数组中循环,我首先看到一个新的charac
从第一个character对象开始,如果我们在charArray数组中循环,我首先看到一个新的character,我需要为它创建一个新的CharacterFrequency对象,然后继续在charArray中迭代,找到更多发生的情况,并通过使用increment()递增来计数在文档中找到的特定字符的CharacterFrequency类的方法。最终结果是找到的每个字符的CharacterFrequency对象以及发生次数 任何帮助都将不胜感激。谢谢 主回路:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.io.FileReader;
import java.io.IOException;
public class CharFreqMain {
public static void main(String[] args) throws IOException {
//declare variables and object types
ArrayList<CharacterFrequency> charObjectsArray = new ArrayList<CharacterFrequency>();
//try to open file and if not found catch file not found exception and exit
try {
//create scanner object of text file BufferedReader for efficiency
BufferedReader br = new BufferedReader(new FileReader("C:/text.txt"));
//create string to store each line
String s;
//while loop reads each line of BufferedReader br and creates string
while ((s = br.readLine()) != null) {
//create character array from string s
char[] charArray = s.toCharArray();
CharacterFrequency newcharobj = new CharacterFrequency();
System.out.println(charArray);
//iterate though character array
for (char c : charArray) {
//check if the current object has the same character being checked and increment
if (c == newcharobj.getCharacter()) {
newcharobj.increment(1);
}
else {
newcharobj.setCharacter(c);
}
charObjectsArray.add(newcharobj);
}
}
//close BufferedReader br
br.close();
}
//code speaks for itself
catch (FileNotFoundException e) {
System.out.println("File Not Found");
System.exit(0);
}
finally {
//iterate through objects in charObjs Array and print characters and freqs to console
for (CharacterFrequency charObject : charObjectsArray) {
try {
System.out.println(charObject.getCharacter() + " | " + charObject.getFrequency());
}
catch(NullPointerException e) {
}
//build write to file Here
}
}
}
}
这部分代码正是我需要帮助的地方:
//create character array from string s
char[] charArray = s.toCharArray();
CharacterFrequency newcharobj = new CharacterFrequency();
System.out.println(charArray);
//iterate though character array
for (char c : charArray) {
//check if the current object has the same character being checked and increment
if (c == newcharobj.getCharacter()) {
newcharobj.increment(1);
}
else {
newcharobj.setCharacter(c);
}
charObjectsArray.add(newcharobj);
}
}
据我所知,似乎您希望阅读每一行,然后为每个字符及其出现次数构建一个
CharacterFrequency
对象
这可以通过Java stream API轻松实现:
List<CharacterFrequency> resultSet =
new BufferedReader(new FileReader("C:/text.txt"))
.lines()
.flatMap(s -> s.chars().mapToObj(a -> (char)a))
.collect(Collectors.groupingBy(Function.identity(),
Collectors.summingInt(e -> 1)))
.entrySet()
.stream()
.map(e -> new CharacterFrequency(e.getKey(), e.getValue()))
.collect(Collectors.toCollection(ArrayList::new));
解读上述解决方案:
- 上面的
方法产生一个 ,其中,元素是从中读取的行BufferedReader
BufferedReader
将每个字符串转换为.flatMap(s->s.chars().mapToObj(a->(char)a))
流,该流
然后将所有嵌套的flatMap
折叠为单个流
流
- 使用
我们检索一个.collect(Collectors.groupingBy(Function.identity()), 收集器.summingit(e->1)))
,其中键是字符,整数表示给定字符的出现次数映射
- 然后,我们使用
从.entrySet().stream()
创建一个流,并使用entrySet
.map(e->newcharacterfrequency(e.getKey(),e.getValue())创建
对象CharacterFrequency
- 最后,我们使用
.collect(Collectors.toCollection(ArrayList::new))收集到一个列表实现代码>
List<CharacterFrequency> resultSet =
new BufferedReader(new FileReader("C:/text.txt"))
.lines()
.flatMap(s -> s.chars().mapToObj(a -> (char)a))
.collect(Collectors.groupingBy(Function.identity(),
Collectors.summingInt(e -> 1)))
.entrySet()
.stream()
.map(e -> new CharacterFrequency(e.getKey(), e.getValue()))
.collect(Collectors.toCollection(ArrayList::new));
public CharacterFrequency(char character, int frequency) {
this.character = character;
this.frequency = frequency;
}