下面程序就是找出 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());
}
}