关闭

java 比较两对象的方法

275人阅读 评论(0) 收藏 举报
分类:

如果对象是bean

import java.lang.reflect.Field;

 public static <T> Map<String, String> compare(T obj1, T Obj2)  
        throws Exception {  
  
    Map<String, String> result = new HashMap<String, String>();  
  
    Field[] fs = obj1.getClass().getDeclaredFields();  
    for (Field f : fs) {  
        f.setAccessible(true);  
        Object v1 = f.get(obj1);  
        Object v2 = f.get(Obj2);  
        result.put(f.getName(), String.valueOf(equals(v1, v2)));  
    }  
    return result;  
}  
 public static boolean equals(Object obj1, Object obj2) {  
  
    if (obj1 == obj2) {  
        return true;  
    }  
    if (obj1 == null || obj2 == null) {  
        return false;  
    }  
    return obj1.equals(obj2);  
}  


如果对象是集合(集合中存map)

import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Set;


import org.apache.commons.lang.builder.EqualsBuilder;


/**
 * 比较的工具类
 * @author Carsomyr
 *
 */
public class CompareUtil {

/**
* 比较两个Collections中的数据是否一致
* @param source1
* @param source2
* @param primaryKey : {Collections中元素主键字段,唯一确定一个元素,为空则按原始顺序比较}
* @param specifiedFields : {指定比较的特定字段,为空则比较所有字段}
* @return
*/
public static boolean compare(List<PageData> source1, List<PageData> source2, final String primaryKey, String[] specifiedFields){
boolean isEqual = true;

if(source1==null && source2!=null){
isEqual = false;
}else if(source1!=null && source2==null){
isEqual = false;
}else if(source1.size()!=source2.size()){
isEqual = false;
}else{
if(primaryKey!=null && !primaryKey.trim().equals("")){//按照主键排序,确保后续按相同的下标拿到的数据是相互对应的
Comparator<PageData> comparator = new Comparator<PageData>() {


@Override
public int compare(PageData o1, PageData o2) {
if(o1.getString(primaryKey)==null || o1.getString(primaryKey).trim().equals(""))
return 1;
else if(o2.getString(primaryKey)==null || o2.getString(primaryKey).trim().equals(""))
return -1;
else 
return o1.getString(primaryKey).compareTo(o2.getString(primaryKey));
}
}; 

Collections.sort(source1, comparator);
Collections.sort(source2, comparator);
}

PageData pd1 = null;
PageData pd2 = null;
for(int i=0, j=source1.size(); i<j; i++){
pd1 = source1.get(i);
pd2 = source2.get(i);

if(!CompareUtil.isEqual(pd1, pd2, specifiedFields)){
isEqual = false;
break;
}
}
}

return isEqual;
}


/**
* 判断两个PageData的值是否一致
* @param pd1
* @param pd2
* @param specifiedFields
* @return
*/
@SuppressWarnings("rawtypes")
private static boolean isEqual(PageData pd1, PageData pd2, String[] specifiedFields) {
EqualsBuilder equalsBuilder = new EqualsBuilder();

boolean isEqual = true;
if(specifiedFields!=null){
for (String field : specifiedFields) {
equalsBuilder.append(pd1.getString(field), pd2.getString(field));
}
isEqual = equalsBuilder.isEquals();
} else {
Set pd1Set = pd1.keySet();
Set pd2Set = pd2.keySet();

if(pd1Set==null && pd2Set!=null){
isEqual = false;
} else if(pd1Set!=null && pd2Set==null){
isEqual = false;
} else if(pd1Set.size()!=pd2Set.size()){
isEqual = false;
} else {
Iterator iter = pd1Set.iterator();
Object pd1Key = null;

while(iter.hasNext()){//若两个PageData的key不一致,视为不同
pd1Key = iter.next(); 
if(!pd2.containsKey(pd1Key)){
isEqual = false;
break;
}
}

if(isEqual){//当两个PageData的key一致,但相同的key对应了不同的值,视为不同,否则视为相同
iter = pd1Set.iterator();

while(iter.hasNext()){
pd1Key = iter.next();

equalsBuilder.append(pd1.get(pd1Key), pd2.get(pd1Key));
}

isEqual = equalsBuilder.isEquals();
}
}
}

return isEqual;
}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10049次
    • 积分:174
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:9篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论