java - Java,对象化文件中的唯一字符并通过字符对象的增量()方法计算出现次数
问题描述
我正在开发一个将文本文件作为输入的java程序,为每个字符创建一个“CharacterFrequency”对象并计算每个字符的出现次数。到目前为止,我已经为建筑对象构建了类,该类似乎以其当前形式起作用,但我在主循环中的逻辑程序流遇到问题。我不知道如何构造我的 for if else while 循环等以循环遍历字符并增加每个对象的计数。
有些人要求澄清,所以让我试着换个说法。
从第一个字符对象开始,如果我们遍历 charArray 数组,我首先会看到一个新字符,我需要为它创建一个新的 CharacterFrequency 对象,然后继续遍历 charArray 并找到更多出现次数并通过使用递增计数它们CharacterFrequency 类的 increment() 方法,用于在文档中找到的特定字符。最终结果是找到的每个字符的 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
}
}
}
}
字符频率类:
public class CharacterFrequency {
char character;
int frequency;
int i;
int freq = 0;
public char getCharacter() {
return this.character;
}
public void setCharacter(char character) {
this.character = character;
}
public int getFrequency() {
return this.frequency;
}
public void setFrequency(int frequency) {
this.frequency = frequency;
}
public void increment(int i) {
freq = freq + i;
}
}
这部分代码特别是我需要帮助的:
//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 流 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));
这假设您在CharacterFrequency
类中有一个构造函数,如下所示:
public CharacterFrequency(char character, int frequency) {
this.character = character;
this.frequency = frequency;
}
破译上述解决方案:
- 上述
lines
方法BufferedReader
产生 aStream<String>
,其中元素是从 this 读取的行BufferedReader
。 .flatMap(s -> s.chars().mapToObj(a -> (char)a))
会将每个字符串转换为 aStream<Character>
然后flatMap
将所有嵌套折叠Stream<Stream<Character>>
成一个Stream<Character>
..collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(e -> 1)))
我们检索 a ,Map<Character, Integer>
其中键是字符,整数表示该给定字符的出现次数。- 然后我们从
entrySet
with创建一个流.entrySet().stream()
并CharacterFrequency
用.map(e -> new CharacterFrequency(e.getKey(), e.getValue()))
- 最后,我们收集到一个列表实现
.collect(Collectors.toCollection(ArrayList::new));
推荐阅读
- php - 有没有办法从下面的代码中获取 account_name 值并解析为 json
- python - 如果具有相似的模式,Python 正则表达式会捕获该组
- c# - 如何设置标题内容-tye“text/xml;charset=utf-8”soap请求
- mysql - 需要帮助查找数字在查询结果中重复的次数
- shell - Shell sed - 在文档中出现一次的字符串之间选择多行,几个错误
- python - 使用 curses 或任何可用的东西使 Irssi 像 Python 中的文本前端
- c# - 尝试从 VS2019 中的控制台应用程序调用简单的 POST API
- excel - 如何阻止用户在特定单元格范围内修改超过 2 个单元格值
- angular - 正确处理ngrx效果catchError
- ruby - 为什么Ruby解析文件时常量没有像局部变量一样初始化?