List集合对象去重-项目实战

来源:互联网 发布:ic卡读写器单片机 编辑:程序博客网 时间:2024/06/20 00:37

在项目开发中从第三方数据源中获取数据存在的问题,以前看了不少的算法,第一次在实践的场景中使用,哈哈,虽然效率很低,但是还能接受!

1业务场景:

根据姓名,总欠款和已还部分金额在账户表初始化目前用户总欠款和已还部分金额。
(1)案例数据:
存在数据集,每个数据集包含三个属性:
姓名(name) 总欠款(total) 已还部分金额(part)
小王 400 100
小王 200 100
小王 300 100
小芳 500 200
小李 600 100
小王正常的顺序 400 100、300(400-100) 100、200(300-100) 100, 但是我们是从数据集中取出来存放到集合(list中), 我要做的就是:从当前的list集合中获取每个用户当前总欠款和已还部分金额。

2算法分析:

普通的去重方法一个是利用集合set,另一个是list本身的contain方法(当然还有其他的方法)。set和list比较基本类型的时,都是值比较,而比较引用类型时,比较的也是‘值’比较,而这个值指的是对象的地址比较。

3算法思路:

(1)step1:复制集合,集合A、B,两个集合中数据相同,一个作为需要查找元素(A),一个作为 结果集合(B)(虽然刚开始集合中数据相同,我要做的就是去掉集合中同一个用户不是当前拥有的总金额和欠款)。
(2) step2: 循环集合A,从集合A中取出一个对象(t),在集合B中查找对象(t)的name属性,如果和t的属性相同, 添加到中间集合temp中。
(3) step3:在中间集合temp中查找总欠款和已还部分金额最新的值,保存对象u
(4) step4: 去掉集合(B)中和对象u的name属性相同的对象,然后将u对象增加到集合B中–>去掉集合中的属性值需要注意因为去掉集合中对象时,集合的长度是发生变化的。用for循环可能存在问题。

4代码

实体
public class User {    private String  name;    private int part;    private int total;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getPart() {        return part;    }    public void setPart(int part) {        this.part = part;    }    public int getTotal() {        return total;    }    public void setTotal(int total) {        this.total = total;    }}

测试

public class Test {    public static void main(String[] args) {        //step1        List<User> list1 =  add();        List<User> list2 = new ArrayList<User>();        list2.addAll(list1);        for(int i=0;i<list1.size();i++){            User u1 =   list1.get(i);            //step2            List<User> temp = new ArrayList<User>();            for(int j=0;j<list2.size();j++){                User u2 = list2.get(j);                if(u1.getName().equals(u2.getName())){                    temp.add(u2);                }            }            //step3            if(temp.size()>1){                User user = new User();                int hei = 0;                int age = 0;                for(int j=0;j<temp.size();j++){                    if(j == 0 ){                        hei = temp.get(0).getTotal();                        age = temp.get(0).getPart();                        user.setName(temp.get(0).getName());                    }                    User u  = temp.get(j);                    if(hei > u.getTotal()){                        hei = u.getTotal();                        age = u.getPart();                    }                }                user.setTotal(hei);                user.setPart(age);                //step4                Iterator<User> it = list2.iterator();                while(it.hasNext()){                    User uu = it.next();                    if(uu.getName().equals(user.getName())){                        it.remove();                    }                }                list2.add(user);            }        }        for(User uuu :list2){            System.out.println(uuu.getName()+" "+ uuu.getPart()+" "+uuu.getTotal());        }    }    public static List<User> add() {        List<User> list =new ArrayList<User>();        User u1 = new User();        u1.setName("wang");        u1.setPart(100);        u1.setTotal(400);        User u2 = new User();        u2.setName("wang");        u2.setPart(100);        u2.setTotal(300);        User u3 = new User();        u3.setName("wang");        u3.setPart(100);        u3.setTotal(200);        User u4 = new User();        u4.setName("ma");        u4.setPart(27);        u4.setTotal(177);        User u5 = new User();        u5.setName("fa");        u5.setPart(27);        u5.setTotal(177);        list.add(u1);        list.add(u2);        list.add(u3);        list.add(u4);        list.add(u5);        return list;    }}

扩展:算法思路中step1、step2、step4不变,
step3:将temp中的集合根据total进行比较,排序,可以使用comparator集合外部实现的排序和comparable集合内部定义的方法实现的排序 取出最小的。

原创粉丝点击