Java 查找两个有复杂对象的集合中的不同元素和相同的元素

简介: Java 查找两个有复杂对象的集合中的不同元素和相同的元素

1、定义一个测试对象RolePerm

public class RolePerm{
    private Long rid;
    private Long pid;
    public void setRid(Long rid){
        this.rid=rid;
    }
    public Long getRid(){
        return rid;
    }
    public void setPid(Long pid){
        this.pid=pid;
    }
    public Long getPid(){
        return pid;
    }
    /**
     *重写hashCode,方便集合的操作
     */
    @Override
    public int hashCode() {
        return (int) (this.pid+this.rid);
    }
    /**
     *重写equals,只有pid和rid都相等,才认为这个对象是想等的
     */
    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof RolePerm)){
            return false;
        }
        RolePermrp = (RolePerm) obj;
        return (this.pid == rp.pid) && (this.rid == rp.rid);
    }
}

2、提取两个集合中的不同元素和相同的元素

/**
 * 获取两个集合不同
 * @param rps1  rps1数据
 * @param rps2  rps2数据
 * @return  0:rps1中独有的数据;1:交集的数据;2:rps2中的独有数据
 */
private Map<Integer, List<RolePerm>> findListDiff(List<RolePerm> rps1,List<RolePerm> rps2){
    //判断不能为空
    if(rps1 == null || rps1.isEmpty() || rps2 == null || rps1.isEmpty()) return null;
    //保存最后的数据
    Map<Integer, List<RolePerm>>  mapList = new HashMap<Integer, List<RolePerm>>(3);
    //复制rps1,作为备份
    List<RolePerm> rps1_bak = new ArrayList<RolePerm>(rps1);
    //1、获取rps1中与rps2中不同的元素
    rps1.removeAll(rps2);
    //2、获取rps1和rps2中相同的元素
    rps1_bak.removeAll(rps1);
    //3、获取rps2中与rps1中不同的元素
    rps2.removeAll(rps1_bak);
    //经过此转换后rps1中数据与rps2中的数据完全不同
    //rps1_bak是rps1和rps2的交集
    //rps2中的数据与rps1中的数据完全不同
    mapList.put(0, rps1);//rps1中独有的数据
    mapList.put(1, rps1_bak);//交集的数据
    mapList.put(2, rps2);//rps2中的独有数据
    return mapList;
}

相关文章
|
4天前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
|
23天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
11天前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
17 4
|
13天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
23 2
|
12天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
17天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
16天前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
24 1
|
17天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
17天前
|
Java 开发者
|
26天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
下一篇
无影云桌面