Java 学习笔记---Java List合并重复类型

9 篇文章 0 订阅
3 篇文章 0 订阅

1、问题描述:
要合并A B 两个集合(A B 内部不重复),等到C 要求C没有重复的类型 ;
A.removeAll(B);
A.addAll(B);
2、问题描述:
要合并A B 两个集合,等到C 要求C没有重复的类型,重复类型中的权重相加;
想到的方法:
1、排序
2、合并重复

具体代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
//数据类型 对象类
class A {
    public String name;
    public int num;

    public A(){ 
    }

    public A(String name, int num) {
        super();
        this.name = name;
        this.num = num;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "A [name=" + name + ", num=" + num + "]";
    }

//  @Override
//  public boolean equals(Object obj) {
//      A a=(A)obj;
///     if (this.getName().equals(a.getName())) {
//          return true;
//      }
//      return false;
//  }
}

public class MergeColection {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        List<A> aa1=new ArrayList<A>();
        aa1.add(new A("A",1));
        aa1.add(new A("B",1));
        aa1.add(new A("C",1));
        List<A> aa2=new ArrayList<A>();
        aa2.add(new A("B",1));
        aa2.add(new A("E",1));
        aa2.add(new A("C",1));
        aa2.add(new A("A",1));
        aa2.add(new A("A",1));
        List<A> a =new ArrayList<A>();
        a.addAll(aa1);
        a.addAll(aa2);

        for (A a2 : a) {
            System.err.println("排序前的数据: "+a2);
        } 

        Collections.sort(a,new comparator());

        for (A a2 : a) {
            System.err.println("排序后的数据: "+a2);
        }
        List<A> list=mergeAB (a);

        for (A a2 : list) {
            System.err.println("合并名字相同的数据: "+a2);
        }
    }

    public static List<A> mergeAB (List<A> a) {
        List<A> list = new ArrayList<A>();
        A r1 = new A();
        A r2=new A();
        r1 = a.get(0);
        for (A aa : a) {
            if (compare(aa, r1)) {
                if (r2.getName() != null ) {
                    r2.setNum(r2.getNum() + aa.getNum());
                }else if (r2.getName()==null) {
                    r2=r1;
                }

            } else {
                list.add(r2);
                r1 = aa;
                r2=r1;
            }
        }
        //如果最后一项,只出现一次 
        if (!list.contains(r1)) {
            list.add(r1);
        }

        return list;
    }

    //对象内部比较
    public static boolean compare(Object o1, Object o2) {
        A a = (A) o1;
        A a2 = (A) o2;

        if (a.getName().equals(a2.getName())) {
            return true;
        }
        return false;
    }

    // 自定义比较器
    static class comparator implements Comparator {
        public int compare(Object object1, Object object2) {// 实现接口中的方法
            A a1 = (A) object1; // 强制转换
            A a2 = (A) object2;
            return a1.getName().compareTo(a2.getName());
        }
    }
}

控制台输出的结果:

排序前的数据: A [name=A, num=1]
排序前的数据: A [name=B, num=1]
排序前的数据: A [name=C, num=1]
排序前的数据: A [name=B, num=1]
排序前的数据: A [name=E, num=1]
排序前的数据: A [name=C, num=1]
排序前的数据: A [name=A, num=1]
排序前的数据: A [name=A, num=1]

排序后的数据: A [name=A, num=1]
排序后的数据: A [name=A, num=1]
排序后的数据: A [name=A, num=1]
排序后的数据: A [name=B, num=1]
排序后的数据: A [name=B, num=1]
排序后的数据: A [name=C, num=1]
排序后的数据: A [name=C, num=1]
排序后的数据: A [name=E, num=1]
合并名字相同的数据: A [name=A, num=3]
合并名字相同的数据: A [name=B, num=2]
合并名字相同的数据: A [name=C, num=2]
合并名字相同的数据: A [name=E, num=1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值