Java,将文件中的唯一字符对象化,并通过character对象的increment()方法计算出现次数

Java,将文件中的唯一字符对象化,并通过character对象的increment()方法计算出现次数,java,object,text,character,Java,Object,Text,Character,我正在开发一个java程序,该程序将文本文件作为输入,为每个字符创建一个“CharacterFrequency”对象,并计算每个字符的发生次数。到目前为止,我已经为building对象构建了类,该类似乎以其当前的形式起作用,但是我在主循环中的逻辑程序流方面遇到了问题。我不知道如何构造if-else-while循环等来循环字符并增加每个对象的计数 有些人要求澄清,所以让我试着用其他术语来解释 从第一个character对象开始,如果我们在charArray数组中循环,我首先看到一个新的charac

我正在开发一个java程序,该程序将文本文件作为输入,为每个字符创建一个“CharacterFrequency”对象,并计算每个字符的发生次数。到目前为止,我已经为building对象构建了类,该类似乎以其当前的形式起作用,但是我在主循环中的逻辑程序流方面遇到了问题。我不知道如何构造if-else-while循环等来循环字符并增加每个对象的计数

有些人要求澄清,所以让我试着用其他术语来解释


从第一个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))收集到一个列表实现

具体来说,您的问题是什么?我不知道如何构造我的for if else while循环等来循环字符并增加每个对象的计数太宽了。请你把问题再细化一下好吗?你到底有什么问题,从第一个character对象开始,如果我们在charArray数组中循环,我首先看到一个新的字符,我需要为它创建一个新的CharacterFrequency对象,然后继续在charArray中迭代,找到更多发生的情况,并通过使用increment()递增来计算它们在文档中找到的特定字符的CharacterFrequency类的方法。最终的结果是找到的每个字符都有一个CharacterFrequency对象和发生次数。@BrentVaalburg如果您从Java-8开始接受使用流API的解决方案,那么这只需10行即可轻松完成:)。由于某种原因,我无法编译它。方法引用中的返回类型错误:无法将java.util.ArrayList转换为C@BrentVaalburg您使用的是什么版本的java?我的答案中的代码只有在使用JDK-8及更高版本时才会编译。如果您使用的是JDK-8,那么您使用什么IDE来编译此代码?
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;
}