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

Java实现删除文本文件首值重复整行并存入ArrayList

Java按首列去重文本行并存入ArrayList的解决方案

你用的stream().distinct()之所以没生效,是因为它是对整行字符串做去重判断——只有当两行完全一模一样时才会被过滤。但你的需求是首列值重复就保留第一行、删除后续行,这个方法显然不匹配。

下面是两种实用的解决方案:

方案一:用LinkedHashSet追踪首列(保留顺序)

这种方法能保证保留首次出现的行,同时过滤后续首列重复的行,且输出顺序和原文件一致:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public class FirstColumnDeduplicator {
    public static void main(String[] args) {
        String filePath = "your-text-file.txt";
        List<String> sourceList = new ArrayList<>();

        // 读取文本文件到列表
        try {
            sourceList = Files.readAllLines(Paths.get(filePath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        List<String> uniqueList = new ArrayList<>();
        Set<String> seenFirstColumns = new LinkedHashSet<>();

        for (String line : sourceList) {
            // 分割首列,根据你的文件分隔符修改(比如\t制表符、\\s+多空格)
            String firstColumn = line.split(",")[0].trim();
            // add返回true表示该首列首次出现,加入结果列表
            if (seenFirstColumns.add(firstColumn)) {
                uniqueList.add(line);
            }
        }

        // uniqueList就是处理后的结果,首列无重复,保留首次出现的行
        // 这里可以直接使用这个ArrayList做后续操作
        uniqueList.forEach(System.out::println);
    }
}

注意事项

  • 替换代码中的分隔符:如果你的文件是制表符分隔,把split(",")改成split("\t");如果是空格分隔,用split("\\s+")匹配多个连续空格。
  • LinkedHashSet既保证了去重,又维持了元素的插入顺序,所以原文件中第一次出现的行会被优先保留。

方案二:用Stream API实现(支持串行/并行流)

如果偏好流式操作,可以结合线程安全的集合来做过滤:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

public class StreamBasedDeduplicator {
    public static void main(String[] args) {
        String filePath = "your-text-file.txt";
        List<String> sourceList = null;

        try {
            sourceList = Files.readAllLines(Paths.get(filePath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (sourceList == null) return;

        // 用线程安全的集合追踪已出现的首列,并行流也能安全使用
        Set<String> seenColumns = ConcurrentHashMap.newKeySet();
        List<String> uniqueList = sourceList.stream()
                .filter(line -> {
                    String firstCol = line.split(",")[0].trim();
                    return seenColumns.add(firstCol);
                })
                .collect(Collectors.toList());

        // 输出处理后的结果
        uniqueList.forEach(System.out::println);
    }
}

说明

  • 用ConcurrentHashMap.newKeySet()是为了保证并行流场景下的线程安全,如果只使用串行流,也可以换成普通的new HashSet<>()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:15:32