首页
登录 | 注册

java在两个集合中,寻找在另一个集合中有相同键值的记录(外键依赖).

假设两个有序集合A,B,找出A.id=B.id中的A记录.
下面程序就是找出 A.val = B.val && A.rid=B.rid中的所有A记录.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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


    /**
     * 获取两个集合不同
     * @param rps1  rps1数据
     * @param rps2  rps2数据
     * @return  0:rps1中独有的数据;1:交集的数据;2:rps2中的独有数据
     */
    private static Map> findListDiff(List rps1,List rps2){
        //判断不能为空
        if(rps1 == null || rps1.isEmpty() || rps2 == null || rps1.isEmpty()) return null;
        //保存最后的数据
        Map>  mapList = new HashMap>(3);
     
        //复制rps1,作为备份
        List rps1_bak = new ArrayList(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;
    }
    
    private static List findList(List rps1,List rps2){
        //判断不能为空
        if(rps1 == null || rps1.isEmpty() || rps2 == null || rps1.isEmpty()) return null;
        //保存最后的数据
        List merge =new ArrayList();
      
        boolean bFind = false;
        RolePerm2 rTmp = null, lastTmp,max;
        int n = 0;
        max = rps2.get(rps2.size()-1);
        for(RolePerm2 r : rps1){
        //System.out.println("rid=" + r.rid + ";pid=" + r.pid + ";val="+r.val);
        bFind = false;
        lastTmp = rTmp;
        rTmp = null;
       
        for(RolePerm2 r2 : rps2){
        n++;
        if (r.equals(r2)){
        rTmp = r2;
        System.out.println("result = rid=" + r.rid + ";pid=" + r.pid + ";val="+r.val);
        merge.add(r);
        bFind = true;
        }else{
        if (bFind || r.gt(max)){
        break;
        }
        }
        }
       
        if (lastTmp!=null && !lastTmp.equals(rTmp)){
        rps2.remove(lastTmp);
        System.out.println("xxxxx = rid=" + lastTmp.rid + ";pid=" + lastTmp.pid + ";val="+lastTmp.val);
        lastTmp = null;
        }
        }
        
        System.out.println("n = "+n);
        return merge;
    }
    
    public static void main(String args[]){
        //集合一
        List _first=new ArrayList();
        _first.add(new RolePerm2("bom",101, 100));
        _first.add(new RolePerm2("jim",100, 100));
        
        _first.add(new RolePerm2("jack",102, 100));
        _first.add(new RolePerm2("jack",102, 202));
        _first.add(new RolePerm2("java",103, 100));
        _first.add(new RolePerm2("java",104, 201));
        _first.add(new RolePerm2("javp",103, 100));
        _first.add(new RolePerm2("pava",103, 200));
        _first.add(new RolePerm2("pavk",103, 200));
        
        //集合二
        List _second=new ArrayList();
        _second.add(new RolePerm2("bom",101, 200));
        _second.add(new RolePerm2("good",201, 200));        
        _second.add(new RolePerm2("happy",202, 200));     
        _second.add(new RolePerm2("jack",102, 200));        
        _second.add(new RolePerm2("jacp",104, 200));
        _second.add(new RolePerm2("jacs",105, 200));
        _second.add(new RolePerm2("java",103, 200));        
        _second.add(new RolePerm2("javk",103, 200));


//        Map> ret = findListDiff(_first, _second);
//       
//        System.out.println("_second中仅存在于_first中的:"+ret.get(0).size());
//        System.out.println("_second中仅存在于_second中的:"+ret.get(2).size());
//        System.out.println("_second中交集的:"+ret.get(1).size());
        
        List ret = findList(_first, _second);
        
        System.out.println("_second中交集的:"+ret.size());
    }


  
}



相关文章

  • http://blog.csdn.net/qq_19776363/article/details/47440873 一:对象模块. 一.初始化 1.对this.super,构造函数,构造代码块,静态代码块总结. this:代表当前对象,也就 ...
  • Java基础20:Java8新特性终极指南
    这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Ja ...
  • Java集合详解4:HashMap和HashTable
    具体代码在我的GitHub中可以找到 喜欢的话麻烦star一下哈 https://h2pl.github.io/2018/05/10/collection4 我的个人博客主要发原创文章,也欢迎浏览 https://h2pl.github.i ...
  • Java集合详解3:Iterator,fail-fast机制与比较器
    具体代码在我的GitHub中可以找到 喜欢的话麻烦star一下哈 https://h2pl.github.io/2018/05/9/collection3 我的个人博客主要发原创文章,也欢迎浏览 https://h2pl.github.io ...
  • Java基础19:Java集合框架梳理
    这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Ja ...
  • [IT168 技术文章] JAVA 语言的来源.及特点 在这个高速信息的时代,商家们纷纷把信息.产品做到Internet国际互连网页上.再这些不寻常网页的背后,要属功能齐全.安全可靠的编程语言,Java是当之无愧的.Java是由Sun Mi ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.016 s.
京ICP备10005923号