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


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. 核心原理

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

Decktopus AI Decktopus AI

AI在线生成高质量演示文稿

Decktopus AI 153 查看详情 Decktopus 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 base标签  # 北京通用网络营销推广  # 安徽seo技巧哪个便宜  # 是在  # 这是  # 配置文件  # java  # 自定义  # 并将  # 键值  # 数据结构  # 文本文件  # 第一个  # 代码可读性  # 键值对  # 字符串解析  # stream  # ai  # 工具  # app 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  铁拳8在线玩 铁拳8在线秒玩入口  Dash应用多值文本输入处理与类型转换教程  英雄联盟争者留名活动介绍  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  Google Drive API服务器端访问指南:服务账户认证详解  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  excel怎么计算平均值 excel平均函数*ERAGE使用教学  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  Teambition网盘如何共享文件  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  PHP动态导航按钮:根据用户登录状态切换链接与文本  冬季去哪个城市旅游更有可能观测到极光  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  如何在CSS中设置背景图像:一个全面指南  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  J*aScript事件处理:优化键盘输入与表单提交的实践指南  汽水音乐车机版 汽水音乐车机版官方入口  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式  Symfony路由参数转换器:实体存在性验证与错误处理策略  铁路12306入口 铁路12306官网版入口登录网址  如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  广州地铁app准妈咪徽章领取方法  《领英》查看屏蔽名单方法  c++如何链接Boost库_c++准标准库的集成与使用  免费占卜在线神算_免费占卜手机神算  J*aScript二进制处理_ArrayBuffer与Blob  J*aScript实现下拉菜单驱动的动态表格数据展示  韩剧圈正版官网入口_韩剧圈官方指定登录  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  word表格如何按某一列内容进行排序_Word表格按列排序方法  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  如何配置VS Code作为您Git操作的默认编辑器  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  荣耀盒子应用管理技巧  win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】  Composer reinstall命令重装损坏的包  Win10截图远程协助 Win10远程桌面截屏法【场景应用】  LocoySpider如何批量采集电商商品_LocoySpider电商采集的模板应用  抖音赚钱快速入门_新手必看的抖音赚钱步骤  Python实战:高效处理实时数据流中的最小/最大值 

 2025-12-03

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.