本文已参与「新人创作礼」活动,一起开启掘金创作之路。
需求说明
多个类型的对象集合,需要进行去重操作,如Cat集合包含名字为aa,bb,cc的对象,Dog集合包含名字为aa,cc,dd的对象,现需要进行去重,源数据和操作后的结果如下表所示
对象 | 去重前 | 去重后 |
---|---|---|
Cat | aa、bb、cc | aa、bb、cc |
Dog | aa、cc、dd | dd |
Lion | bb、cc、ee | ee |
Tiger | aa、cc、dd、ee、ff | ff |
方法说明
解决办法很好理解,如将Dog集合中名字与Cat集合中名字重复的对象删去即可,由于是不同类型的对象集合,所以无法使用Set集合进行简单的去重操作,在这里需要用到java8的特性stream
完整代码示例
-
各个对象
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类不用发了叭
-
去重过程
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()方法后列表不刷新的问题