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
相关产品推荐
相关产品推荐

