首页 > 解决方案 > 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);
        }
    }

标签: javaobjecttextcharacter

解决方案


据我所知,您似乎想阅读每一行,然后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产生 a Stream<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>其中键是字符,整数表示该给定字符的出现次数。
  • 然后我们从entrySetwith创建一个流.entrySet().stream()CharacterFrequency.map(e -> new CharacterFrequency(e.getKey(), e.getValue()))
  • 最后,我们收集到一个列表实现.collect(Collectors.toCollection(ArrayList::new));

推荐阅读