MST

星途 面试题库

面试题:Java中String构建复杂字符串处理逻辑及内存优化

设计一个Java程序,该程序需要从外部文件读取大量的文本数据(可能导致内存溢出),对这些数据按行进行复杂的字符串处理,例如对每行字符串进行分词、统计词频并按照一定规则排序,最后将处理结果输出到另一个文件。要求使用String相关知识,在保证程序正确性的同时,尽可能优化内存使用和提高处理效率,详细阐述设计思路并给出完整代码。
10.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 逐行读取:为避免一次性将大量数据读入内存导致内存溢出,使用BufferedReader逐行读取文件。
  2. 字符串处理:利用Stringsplit方法进行分词,使用HashMap统计词频。
  3. 排序:将HashMap中的数据转换为List,使用Collections.sort根据词频等规则排序。
  4. 输出:使用BufferedWriter将处理结果逐行写入输出文件。

完整代码

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TextProcessor {
    public static void main(String[] args) {
        String inputFilePath = "input.txt";
        String outputFilePath = "output.txt";

        try (BufferedReader br = new BufferedReader(new FileReader(inputFilePath));
             BufferedWriter bw = new BufferedWriter(new FileWriter(outputFilePath))) {
            Map<String, Integer> wordFrequencyMap = new HashMap<>();
            String line;
            while ((line = br.readLine()) != null) {
                String[] words = line.split("\\s+");
                for (String word : words) {
                    wordFrequencyMap.put(word, wordFrequencyMap.getOrDefault(word, 0) + 1);
                }
            }

            List<Map.Entry<String, Integer>> list = new ArrayList<>(wordFrequencyMap.entrySet());
            Collections.sort(list, (a, b) -> b.getValue().compareTo(a.getValue()));

            for (Map.Entry<String, Integer> entry : list) {
                bw.write(entry.getKey() + ": " + entry.getValue());
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}