不同类型的对象集合按优先级去重

44 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

需求说明

多个类型的对象集合,需要进行去重操作,如Cat集合包含名字为aa,bb,cc的对象,Dog集合包含名字为aa,cc,dd的对象,现需要进行去重,源数据和操作后的结果如下表所示

对象去重前去重后
Cataa、bb、ccaa、bb、cc
Dogaa、cc、dddd
Lionbb、cc、eeee
Tigeraa、cc、dd、ee、ffff

方法说明

解决办法很好理解,如将Dog集合中名字与Cat集合中名字重复的对象删去即可,由于是不同类型的对象集合,所以无法使用Set集合进行简单的去重操作,在这里需要用到java8的特性stream

完整代码示例

  1. 各个对象

    public class Cat {
    
        private int idCat;
        private String name;
    
        public Cat(int idCat, String name) {
            this.idCat = idCat;
            this.name = name;
        }
    
        public int getIdCat() {
            return idCat;
        }
    
        public void setIdCat(int idCat) {
            this.idCat = idCat;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    public class Dog {
    
        private int idDog;
        private String name;
    
        public Dog(int idDog, String name) {
            this.idDog = idDog;
            this.name = name;
        }
    
        public int getIdDog() {
            return idDog;
        }
    
        public void setIdDog(int idDog) {
            this.idDog = idDog;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    // Lion和Tiger类不用发了叭
    
  2. 去重过程

    public class RemovalTest {
    
        public static void main(String[] args) {
            removal();
        }
    
        /**
         * 按对象的name值进行去重操作
         */
        public static void removal() {
            /* 生成测试源数据 */
            List<Cat> cats = new ArrayList<>();
            List<Dog> dogs = new ArrayList<>();
            List<Lion> lions = new ArrayList<>();
            List<Tiger> tigers = new ArrayList<>();
            cats.add(new Cat(1, "aa"));
            cats.add(new Cat(2, "bb"));
            cats.add(new Cat(3, "cc"));
            dogs.add(new Dog(1, "aa"));
            dogs.add(new Dog(2, "cc"));
            dogs.add(new Dog(3, "dd"));
            lions.add(new Lion(1, "bb"));
            lions.add(new Lion(2, "cc"));
            lions.add(new Lion(3, "ee"));
            tigers.add(new Tiger(1, "aa"));
            tigers.add(new Tiger(2, "cc"));
            tigers.add(new Tiger(3, "dd"));
            tigers.add(new Tiger(4, "ee"));
            tigers.add(new Tiger(5, "ff"));
    
            /* 生成对象集合对应的name集合 */
            List<String> catNames = cats.stream().map(Cat::getName).collect(Collectors.toList());
            List<String> dogNames = dogs.stream().map(Dog::getName).collect(Collectors.toList());
            List<String> lionNames = lions.stream().map(Lion::getName).collect(Collectors.toList());
            List<String> tigerNames = tigers.stream().map(Tiger::getName).collect(Collectors.toList());
            System.out.println("源数据-->cats:" + catNames + " ^ dogs:" + dogNames + " ^ lions:" + lionNames + " ^ tigers: " + tigerNames);
    
            /* 去重操作 */
            dogNames.removeAll(catNames);
            lionNames.removeAll(catNames);
            lionNames.removeAll(dogNames);
            tigerNames.removeAll(catNames);
            tigerNames.removeAll(dogNames);
            tigerNames.removeAll(lionNames);
            System.out.println("去重后-->cats:" + catNames + " ^ dogs:" + dogNames + " ^ lions:" + lionNames + " ^ tigers: " + tigerNames);
    
            /* 使用去重后的name集合生成对应的对象集合 */
            List<Cat> catResult = cats.stream().filter(o -> catNames.contains(o.getName())).collect(Collectors.toList());
            List<Dog> dogResult = dogs.stream().filter(o -> dogNames.contains(o.getName())).collect(Collectors.toList());
            List<Lion> lionResult = lions.stream().filter(o -> lionNames.contains(o.getName())).collect(Collectors.toList());
            List<Tiger> tigerResult = tigers.stream().filter(o -> tigerNames.contains(o.getName())).collect(Collectors.toList());
        }
    }
    

    // 打印结果如下
    // 源数据-->cats:[aa, bb, cc] ^ dogs:[aa, cc, dd] ^ lions:[bb, cc, ee] ^ tigers: [aa, cc, dd, ee, ff]
    // 去重后-->cats:[aa, bb, cc] ^ dogs:[dd] ^ lions:[ee] ^ tigers: [ff]
    

注意

在安卓中使用Adapter进行数据展示时,需注意去重前后的对象集合的hash地址是否一样,如不一样,会导致使用notifyDataSetChanged()方法后列表不刷新的问题