新闻中心

J*a中高效删除文本文件重复行:基于首字段的策略与实现

2025-12-03
浏览次数:
返回列表

java中高效删除文本文件重复行:基于首字段的策略与实现

本教程详细阐述了在J*a中如何根据行的首个字段识别并删除文本文件中的重复行,并将处理后的数据存储到列表中。文章深入探讨了两种主要方法:一是利用J*a Stream API的`Collectors.toMap`结合自定义合并函数直接处理字符串列表;二是引入自定义领域对象(如Company类)来封装数据,并通过对象ID进行去重,从而提升代码的可读性和维护性。教程包含详细的代码示例和实现解析。

在处理文本数据时,我们经常会遇到需要去除重复记录的场景。特别是在日志文件或数据导入导出中,如果重复的定义是基于行内某个特定字段(例如,行的第一个逗号分隔值),那么传统的List.stream().distinct()方法将无法满足需求,因为它会比较整行字符串的完全一致性。本文将介绍如何在J*a中,针对以首字段作为重复判断依据的文本行,进行高效的去重操作,并将结果存储到ArrayList中。

理解问题:基于首字段的重复判断

假设我们有一个文本文件,内容如下:

123456,greenwitch street,near dominos store,Opp sandwitch company,Neyork,US,876890
123480,Postwitch street,near KFC store,Opp masala company,Newyork,US,876891
123456,Newyork street,near 100th *enue,King master company,Texas,US,10005

在这个例子中,第一行和第三行的起始数字“123456”是相同的,但行的其余部分不同。我们的目标是删除整个第三行,因为其首字段与第一行重复。

解决方案一:利用 Collectors.toMap 直接处理字符串

J*a 8引入的Stream API为处理集合数据提供了强大而灵活的工具。Collectors.toMap()方法特别适用于根据某个键值进行聚合或去重。其核心思想是:将每行数据解析出一个作为键(Key)的唯一标识,并将整行数据作为值(Value)存储起来。当遇到重复的键时,通过一个合并函数(mergeFunction)来决定保留哪个值。

1. 核心原理

我们将行的第一个逗号分隔值作为键。如果遇到相同的键,我们选择保留第一次出现的值(即最早的记录)。

Tunee AI Tunee AI

新一代AI音乐智能体

Tunee AI 1104 查看详情 Tunee AI

2. 代码实现

import j*a.util.List;
import j*a.util.Map;
import j*a.util.function.Function;
import j*a.util.stream.Collectors;

public class DuplicateRowRemover {

    public static void main(String[] args) {
        List<String> sourceList = List.of(
            "123456,greenwitch street,near dominos store,Opp sandwitch company,Neyork,US,876890",
            "123480,Postwitch street,near KFC store,Opp masala company,Newyork,US,876891",
            "123456,Newyork street,near 100th *enue,King master company,Texas,US,10005"
        );

        List<String> uniqueList = sourceList.stream()
            .collect(Collectors.toMap(
                str -> str.substring(0, str.indexOf(',')), // keyMapper: 提取第一个逗号前的子字符串作为键
                Function.identity(),                       // valueMapper: 整行字符串作为值
                (left, right) -> left                      // mergeFunction: 遇到重复键时,保留左边(即第一个遇到的)值
            ))
            .values()                                      // 获取Map中所有的值(即去重后的行)
            .stream()
            .toList();                                     // 转换为List

        System.out.println("去重后的列表 (字符串方式):");
        uniqueList.forEach(System.out::println);
    }
}

3. 代码解析

  • keyMapper (str -> str.substring(0, str.indexOf(','))): 这个函数负责从每行字符串中提取出作为唯一标识的键。它找到第一个逗号的位置,并截取从开头到该位置的子字符串。
  • valueMapper (Function.identity()): 这个函数指定了Map中存储的值。Function.identity()表示将当前流中的元素本身作为值。
  • mergeFunction ((left, right) -> left): 这是处理重复键的关键。当Collectors.toMap在处理流时遇到一个已经存在于Map中的键时,它会调用这个函数来决定保留哪个值。left代表Map中已有的值,right代表当前流中新遇到的值。-> left表示我们选择保留Map中已有的值,即第一个遇到的记录。如果选择-> right,则会保留最后一个遇到的记录。
  • .values().stream().toList(): 在完成收集后,Map中存储的键值对是唯一的。我们通过.values()获取所有去重后的行字符串集合,然后将其转换回List。

解决方案二:引入自定义领域对象(Domain Class)

直接操作字符串虽然简单,但当数据结构复杂、字段较多时,容易出错且代码可读性差。更专业的做法是定义一个领域对象(如Company类)来封装每行数据,并通过对象的ID属性进行去重。这不仅提升了代码的类型安全性和可读性,也为后续的数据操作提供了便利。

1. 定义领域对象

我们将创建一个Company类来表示文本文件中的每一条公司记录。为了简洁,这里使用Lombok的@Getter和@Builder注解。

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class Company {
    private long id;
    private String street;
    private String locationDescription;
    private String companyName;
    private String state;
    private String country;
    private String zipCode;

    // 静态方法,用于将字符串行解析为Company对象
    public static Company parse(String line) {
        String[] arr = line.split(",");
        if (arr.length < 7) { // 简单校验数据完整性
            throw new IllegalArgumentException("Invalid line format: " + line);
        }
        return Company.builder()
            .id(Long.parseLong(arr[0]))
            .street(arr[1]) // 根据数据结构补充street字段
            .locationDescription(arr[2])
            .companyName(arr[3])
            .state(arr[4])
            .country(arr[5])
            .zipCode(arr[6])
            .build();
    }

    @Override
    public String toString() { // 方便打印
        return id + "," + street + "," + locationDescription + "," + companyName + "," + state + "," + country + "," + zipCode;
    }
}

注意: 原始数据中包含street字段,为了保证数据完整性,Company.parse()方法中已补充该字段的解析。

2. 使用领域对象进行去重

有了Company类后,我们可以先将每行字符串映射成Company对象,然后再利用Collectors.toMap以Company对象的id作为键进行去重。

import j*a.util.List;
import j*a.util.function.Function;
import j*a.util.stream.Collectors;

public class DuplicateCompanyRemover {

    public static void main(String[] args) {
        List<String> sourceList = List.of(
            "123456,greenwitch street,near dominos store,Opp sandwitch company,Neyork,US,876890",
            "123480,Postwitch street,near KFC store,Opp masala company,Newyork,US,876891",
            "123456,Newyork street,near 100th *enue,King master company,Texas,US,10005"
        );

        List<Company> uniqueCompanies = sourceList.stream()
            .map(Company::parse)                           // 将每行字符串解析为Company对象
            .collect(Collectors.toMap(
                Company::getId,                            // keyMapper: 使用Company对象的ID作为键
                Function.identity(),                       // valueMapper: Company对象本身作为值
                (left, right) -> left                      // mergeFunction: 遇到重复ID时,保留第一个Company对象
            ))
            .values()
            .stream()
            .toList();

        System.out.println("\n去重后的列表 (Company对象方式):");

以上就是J*a中高效删除文本文件重复行:基于首字段的策略与实现的详细内容,更多请关注其它相关文章!


# 它会  # 建设一个购物网站要多久  # 昌江县优化网站  # 百货网站建设  # 张店效果好网站优化  # 云南seo厂家  # 东西湖区网络推广网站  # 国外SEO对策  # 玉林网站推广方案  # 搜狗首页seo怎么优化  # 网站建设全包造价  # 第三行  # 是在  # 这是  # java  # 自定义  # 并将  # 键值  # 数据结构  # 文本文件  # 第一个  # 代码可读性  # 键值对  # 字符串解析  # stream  # ai  # 工具  # app 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  J*a 递归快速排序中静态变量的状态管理与陷阱  Golang如何使用context实现超时取消_Golang context超时取消模式实践  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  AO3镜像入口大全 AO3网页版内容访问全集  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  批改网学生版PC登录 批改网官网登录系统入口  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  C#中解析不规范的HTML为XML 常见的坑与解决办法  Golang如何使用net/url解析URL_Golang URL解析与处理方法  曝R星经典之作开发图 设计简陋但信息密集!  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  零跑汽车11月交付量达70327台 实现连续9个月正增长  快手极速版在线观看 官方网页版登录地址  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  J*aScript中在Map循环中检测并处理空数组元素  怎么在mac上运行html代码_mac运行html代码方法【指南】  优化大型XML文件解析:基于Python流式处理的内存高效方案  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  excel怎么制作工资条 excel快速生成工资条的方法  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  离线运行Go语言之旅:本地部署与GOPATH配置指南  Lar*el DB::listen 事件中的查询执行时间单位解析  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  Python实时数据流中的动态最值查找策略  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  必由学网页版入口 必由学官方平台直接访问  J*aScript map 迭代中检测空数组元素的有效方法  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  海棠电脑版入口_通过电脑访问海棠官网阅读  京东单号查询入口_京东快递订单追踪入口  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  Fabric模组开发:自定义物品与物品组的现代管理方法  Lar*el Form Request中唯一性验证在更新操作中的正确实现  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  押井守高度称赞《辐射4》:玩了八年都停不下来!  我的世界官方游戏入口 我的世界官网平台直达链接  免费抖音短视频入口_抖音网页版短视频免费通道  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  Discord Slash 命令响应超时问题的异步解决方案 

搜索