java 比较两对象的方法

转载 2016年08月29日 13:08:46

如果对象是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;
}
}


相关文章推荐

java之比较两个对象

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马   先看一段代码: class Value ...

Java中两个对象的比较 equals()方法和==号的区别

在Java中,时不时我们会把两个对象进行,然而得到的结果却不是我们想的结果,这是怎么回事呢? 一、两种形式的比较:比较时,我们要弄清楚是哪一种比较。       1.值类型比较       即内容...

Java中对两个对象进行比较大小

在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口。String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现...
  • fmwind
  • fmwind
  • 2016年08月11日 16:29
  • 4317

安卓保存图片到SD卡,使用byte流

头几天遇到一个问题:在安卓开发应用中保存图片到SD卡,并且 用户在图库中搜到,类似于缓存的那种形式。最开始的第一想法是改一下后缀名,例如把一个图片保存为image1.txt,这样保存当然没问题,但在应...

greenDAO 简单使用配置

greenDAO 简单使用配置 ** * 1.引入greenDAO 的gradle文件和module的gradle文件一共修改四个地方 * 2。在module的gradle文件中高配置数...

Java 比较String对象的方法

Java中有许多比较String的方法,弄清楚每个方法的使用方式与效果对我们编写代码有益。 public class TestString { private String myself="a...

两个对象用equals方法比较为true,它们的Hashcode值相同吗?

两个对象用equals方法比较为true,它们的Hashcode值相同吗?        答:不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hash...

XML转换为JAVA对象的方法

  • 2016年09月20日 08:48
  • 9.38MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 比较两对象的方法
举报原因:
原因补充:

(最多只允许输入30个字)