资讯专栏INFORMATION COLUMN

java构造list,合并重复的数组

wangjuntytl / 2444人阅读

摘要:在开发项目中遇到了这样的一个问题一个里面有这样的数据公司公司公司公司公司公司我要怎么做才能把他们合并为公司公司公司这边根据字段的公司名将同一公司的不同数据构造一起,做法如下总结双重遍历去重双重遍历构造数据存储构造出来的类型根据项目变化而变化

在开发项目中遇到了这样的一个问题:
一个repeatList里面有这样的数据:

repeatList=[
    {sort="0", company="A公司", value="28432"}
    {sort="0", company="A公司", value="8263685"}
    {sort="0", company="A公司", value="1234"}
    
    {sort="0", company="B公司", value="2234"}
    {sort="0", company="B公司", value="567"}
    
    {sort="0", company="C公司", value="85789"}
    ...
]

我要怎么做才能把他们合并为

list=[
    {sort="0", company="A公司", value1="28432" , value2="8263685",value3="1234"}
    {sort="0", company="B公司", value1="2234" , value2="567"}
    {sort="0", company="C公司", value1="85789"}
]

这边根据b字段的公司名将同一公司的不同数据构造一起,做法如下:

总结:双重遍历+去重

(1)双重遍历构造数据:

//存储构造出来的list,list类型根据项目变化而变化,下面的问号都表示相关的类型,在这里都是要一致的
List oList = new ArrayList<>();

Map> map = new HashedMap();
//第一层for遍历
for(? input : repeatList){
    List list = map.get(input.getString("company"));
    if (list == null) {
        list = new ArrayList<>();
        list.add(input);
        map.put(input.getString("company"), list);
    }
    for (? input2 : repeatList){
        if(input.getString("company").equals(input2.getString("company")) && !list.contains(input2)){
            list.add(input2);
        }
    }
    /*合并筛选出来的同类数据,new出一个用来暂时存储遍历的数据的,
    定义在外面,然后for完之后再用oLsit进行add,就会出现同属性名的值会被后面覆盖,不同属性名则补充添加,
    所以company和sort就无需变属性名,但是value就需要变化*/
    
    ? mergePd = new ?();
    
    //第二层for遍历
    for(? x : list){
        mergePd.put("company", String.valueOf(x.get("company")));
        mergePd.put("sort", String.valueOf(x.get("sort")));
        //定义一个标志,改变value的属性名,达到区分的效果
        String sign = 1;
        mergePd.put("value" + sign, String.valueOf(x.get(value)));
        sign ++;
    }
    oList.add(mergePd);
}

经过上面的构造,会出现这样的结果:

oList=[
    {sort="0", company="A公司", value1="28432" , value2="8263685",value3="1234"}
    {sort="0", company="A公司", value1="28432" , value2="8263685",value3="1234"}
    {sort="0", company="A公司", value1="28432" , value2="8263685",value3="1234"}
    
    {sort="0", company="B公司", value1="2234" , value2="567"}
    {sort="0", company="B公司", value1="2234" , value2="567"}
    
    {sort="0", company="C公司", value1="85789"}
]

(2)去重
因为是每条数据都遍历了,所以会出现一定数量的重复,这时候就需要做去重的步骤,使用java的set方法即可,即在上面方法后面补上:

//set去除outList里面重复的数据,保证每条数据的唯一性
Set set = new HashSet(oList);
oList = new ArrayList(set);

List outList;
outList.addAll(oList);

(3)这时候的结果就是:

outList=[
    {sort="0", company="A公司", value1="28432" , value2="8263685",value3="1234"}
    {sort="0", company="B公司", value1="2234" , value2="567"}
    {sort="0", company="C公司", value1="85789"}
]

这就达到我们想要的结果了

希望我的分享能够帮到大家,若是觉得有用请赐一个赞!!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70884.html

相关文章

  • Java集合问题大汇总

    摘要:集合中成员很丰富,常用的集合有,,等。实现接口的集合主要有。集合中不能包含重复的元素,每个元素必须是唯一的。而以作为实现的构造函数的访问权限是默认访问权限,即包内访问权限。与接口不同,它是由一系列键值对组成的集合,提供了到的映射。 原文地址 Java集合 Java集合框架:是一种工具类,就像是一个容器可以存储任意数量的具有共同属性的对象。 Java集合中成员很丰富,常用的集合有Arra...

    894974231 评论0 收藏0
  • Java编程基础17——集合(List集合)

    1_(去除ArrayList中重复字符串元素方式)* A:案例演示 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 思路:创建新集合方式 import java.util.ArrayList; import java.util.Iterator; public class ArrayList_1_demo { /* 创建新集合将重复元素去掉 * 1.明...

    scola666 评论0 收藏0
  • Java编程基础18——集合(Set集合)

    摘要:并把最终的随机数输出到控制台。方法,在集合中如何存储元素取决于方法的返回值返回,集合中只有一个元素。创建集合对象,传入比较器。 1_HashSet存储字符串并遍历 A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 import java.util.HashSet; public class Demo1_HashSet { p...

    SexySix 评论0 收藏0
  • Java™ 教程(Collection接口)

    Collection接口 Collection表示一组称为其元素的对象,Collection接口用于传递需要最大通用性的对象集合,例如,按照惯例,所有通用集合实现都有一个带有Collection参数的构造函数,此构造函数(称为转换构造函数)初始化新集合以包含指定集合中的所有元素,无论给定集合的子接口或实现类型如何,换句话说,它允许你转换集合的类型。 例如,假设你有一个Collection c,它可...

    lncwwn 评论0 收藏0
  • JavaList集合

    摘要:接口的实现类表示有序的集合元素可以重复,根据索引来寻找元素,放入其中的元素的存储顺序和放入顺序是一致的。包下的集合并发类与等方法装饰的类有什么不同先讲一下这个线程安全的类。 List接口的实现类 List表示有序的集合(元素可以重复),根据索引来寻找元素,放入其中的元素的存储顺序和放入顺序是一致的。 ArrayList showImg(http://pd73wtntw.bkt.clou...

    gplane 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<