You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java读取长文本信息并实现指定规则的文本格式转换

Java实现文本编码转换功能

转换规则梳理

先明确需求中的固定转换规则:

  • 编码单元规则:每个单元由「首字母+数字」组成,首字母对应品牌如下,数字为N时,N=1直接输出品牌名,N>1输出品牌加N-1个+号
    • t→Tesla、n→Nissan、b→BMW、p→Porsche、m→Maserati、a→Audi、v→Volvo、j→Jaguar、c→Cadillac
  • 分组规则:每满指定长度的编码单元后用|分隔,行末尾统一加|
  • 模式判断:首行带=为单组模式,=后数字为全局分组长度;首行带different为多组模式,^开头行后的数字为当前组分组长度

完整实现代码

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class GarageCodeConverter {
    // 首字母到品牌的映射表
    private static final Map<Character, String> BRAND_MAP = Map.of(
            't', "Tesla",
            'n', "Nissan",
            'b', "BMW",
            'p', "Porsche",
            'm', "Maserati",
            'a', "Audi",
            'v', "Volvo",
            'j', "Jaguar",
            'c', "Cadillac"
    );

    public static void main(String[] args) throws Exception {
        // 读取输入文本,可修改路径为你的文件地址,也可以直接替换为字符串输入
        List<String> lines = Files.readAllLines(Paths.get("input.txt"), StandardCharsets.UTF_8);
        if (lines.isEmpty()) return;

        // 处理首行,统一多余空格为单空格
        String firstLine = lines.get(0).replaceAll("\\s+", " ").trim();
        System.out.println(firstLine);

        // 判断是单组模式还是多组模式
        if (firstLine.contains("=")) {
            // 单组模式:提取全局分组长度
            int groupSize = Integer.parseInt(firstLine.split("=")[1].trim());
            for (int i = 1; i < lines.size(); i++) {
                String codeLine = lines.get(i).trim();
                if (codeLine.isEmpty()) continue;
                System.out.println(parseCodeLine(codeLine, groupSize));
            }
        } else {
            // 多组模式:逐行读取分组配置和编码串
            for (int i = 1; i < lines.size(); i++) {
                String line = lines.get(i).trim();
                if (line.isEmpty()) continue;
                if (line.startsWith("^")) {
                    int groupSize = Integer.parseInt(line.substring(1).trim());
                    System.out.printf("#Number of cars = %d%n", groupSize);
                    // 读取下一行的编码串
                    String codeLine = lines.get(++i).trim();
                    System.out.println(parseCodeLine(codeLine, groupSize));
                }
            }
        }
    }

    /**
     * 解析编码行,转换为指定格式输出
     * @param codeLine 原始编码串
     * @param groupSize 分组长度
     * @return 转换后的字符串
     */
    private static String parseCodeLine(String codeLine, int groupSize) {
        List<String> unitList = new ArrayList<>();
        // 拆分所有编码单元,每次步进2位(1个字母+1个数字)
        for (int i = 0; i < codeLine.length(); i += 2) {
            char prefix = codeLine.charAt(i);
            int count = Integer.parseInt(String.valueOf(codeLine.charAt(i + 1)));
            StringBuilder unitSb = new StringBuilder(BRAND_MAP.get(prefix));
            // 数字大于1时追加对应数量的+号
            if (count > 1) {
                // Java 11以下版本可以替换为循环生成+号
                unitSb.append("+".repeat(count - 1));
            }
            unitList.add(unitSb.toString());
        }
        // 按分组长度拼接结果
        StringBuilder resultSb = new StringBuilder();
        for (int i = 0; i < unitList.size(); i++) {
            resultSb.append(unitList.get(i)).append(" ");
            // 每满分组长度加分隔符
            if ((i + 1) % groupSize == 0) {
                resultSb.append("| ");
            }
        }
        // 行末尾补|
        if (resultSb.charAt(resultSb.length() - 2) != '|') {
            resultSb.append("|");
        }
        return resultSb.toString().trim();
    }
}

使用说明

  1. 将需要转换的文本保存为input.txt,和代码放在同一目录下,直接运行即可输出转换后的结果
  2. 低版本Java不支持String.repeat的话,把"+".repeat(count - 1)替换为如下代码即可:
for (int j = 0; j < count -1; j++) {
    unitSb.append("+");
}
  1. 如果不需要从文件读取,直接把Files.readAllLines部分替换为你自己的字符串输入即可。

内容的提问来源于stack exchange,提问作者kelvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:15:04