对比两个对象属性值 并得出差异项

首先创建一个映射差异项的实体类存放 对比字段和对比结果

下面是对比代码 修改一下所要对比的对象和对比完返回的数据即可

/**
 * 获取差异项
 */
private FinanceOrganizationCompare compareMainWithMinor(FinanceOrganizationNew main, FinanceOrganizationNew minor) throws ServiceException {
    FinanceOrganizationCompare compareResult = new FinanceOrganizationCompare();
    //CompareWithApiResult compare = new CompareWithApiResult();
    PropertyDescriptor[] fields = BeanUtils.getPropertyDescriptors(main.getClass());
    int diffCount = 0;
    try {
        for (PropertyDescriptor field : fields) {
            Method readMethod = field.getReadMethod();
            Object mainObj = readMethod.invoke(main);
            Object minorObj = readMethod.invoke(minor);
            if (isIgnore(field)) {
                continue;
            }

            boolean isSame = (mainObj == null && minor == null) || (mainObj != null && mainObj.equals(minorObj));
            CompareWithApiResult result = new CompareWithApiResult();
            if (!isSame && !field.getName().equals("organizationId")) {
                diffCount++;
                //result.setEqual(isSame);
            }

            if (field.getPropertyType() == Date.class) {
                result.setRecommend(mainObj == null ? null : DateFormatUtils.format((Date) mainObj, "yyyy/MM/dd"));
                result.setSource(minorObj == null ? null : DateFormatUtils.format((Date) minorObj, "yyyy/MM/dd"));
            } else {
                result.setRecommend(mainObj == null ? null : mainObj.toString());
                result.setSource(minorObj == null ? null : minorObj.toString());
            }
            if (field.getName().equals("organizationId")){
                result.setFieldCode(field.getName());
                result.setFieldName(EnumExcelField.getFieldValueNameByFieldValue(field.getName() != null ? field.getName() : ""));
                result.setEqual(false);
                Method writeMethod = field.getWriteMethod();
                String json = JSONObject.toJSONString(result);
                String methodName = writeMethod.getName();
                Method resultWriteMethod = BeanUtils.findDeclaredMethodWithMinimalParameters(compareResult.getClass(), methodName);
                resultWriteMethod.invoke(compareResult, json);
                continue;
            }
            result.setFieldCode(field.getName());
            result.setFieldName(EnumExcelField.getFieldValueNameByFieldValue(field.getName() != null ? field.getName() : ""));
            result.setEqual(!isSame);
            Method writeMethod = field.getWriteMethod();
            String json = JSONObject.toJSONString(result);
            String methodName = writeMethod.getName();
            Method resultWriteMethod = BeanUtils.findDeclaredMethodWithMinimalParameters(compareResult.getClass(), methodName);
            resultWriteMethod.invoke(compareResult, json);
        }
    } catch (IllegalAccessException | InvocationTargetException e) {
        throw new ServiceException(e);
    }
    if (diffCount > 0) {
        return compareResult;
    }
    return null;
}

因为时间类型和Class对比完之后给实体类字段类型映射不上所以过滤一下

private static boolean isIgnore(PropertyDescriptor field) {
    String[] ignoreField = {"uploadTime", "uploadId", "class", "createDate","thirdOperation","secondOperation"};
    return Arrays.asList(ignoreField).contains(field.getName());
}

 

<think>好的,我现在需要解决用户的问题:如何计算两个缓冲区(buff)之间的差异。首先,我需要明确用户所说的“缓冲区”具体指的是什么。缓冲区在计算机科学中通常指的是一块内存区域,用于临时存储数据,比如网络传输中的缓冲、图像处理中的像素缓冲等。用户可能是在处理二进制数据、文本数据,或者是某种特定格式的数据结构。 接下来,用户想比较两个缓冲区的差异,这可能涉及到找出它们的不同之处,比如字节级别的差异,或者是内容上的变化。例如,在版本控制中比较文件的差异,或者在网络传输中检测数据包的变化。因此,我需要考虑不同的比较方法,具体取决于数据的类型和用户的需求。 首先,我应该考虑缓冲区的基本属性,比如长度。如果两个缓冲区的长度不同,那么它们显然存在差异,可以直接返回长度不一致的结果。如果长度相同,则需要逐字节比较,找出不同的位置和值。这种方法适用于二进制数据的比较,例如比较两个文件的内容是否完全相同。 如果缓冲区存储的是文本数据,可能需要更高级的比较方法,比如按行比较,或者使用差异算法(如最长公共子序列)来找出具体的修改、添加或删除的内容。例如,Unix系统中的diff工具就是用来比较文本文件的差异的。 另外,用户可能需要统计差异的数量,比如不同的字节数,或者生成一个差异报告,列出所有不同的位置及其原始值和当前值。在某些情况下,用户可能还需要计算相似度,比如使用哈希函数(如MD5、SHA-1)来快速判断两个缓冲区是否相同,尽管这种方法只能判断是否完全相同,无法指出具体差异。 根据提供的引用内容,引用[3]提到了计算可用内存的公式,虽然与缓冲区差异无直接关系,但可能用户在处理内存中的缓冲区时需要考虑内存使用情况。引用[4]中的数组差值比较可能与用户的问题相关,比如寻找与某个值接近的元素,但需要具体分析。 接下来,我需要整理可能的解决方案: 1. **逐字节比较**:适用于二进制缓冲区,逐个字节对比,记录差异位置和值。 2. **哈希比较**:使用哈希算法快速判断两个缓冲区是否完全相同。 3. **文本差异比较**:针对文本内容,使用差异算法生成修改记录。 4. **相似度计算**:计算两个缓冲区的相似度百分比,比如基于相同字节的比例。 5. **内存对比工具**:利用现有工具或库(如memcmp函数)进行高效比较。 此外,还需要考虑编程语言的选择,例如用户是否在Python、C、Java等环境下操作。例如,在Python中,可以直接比较字节对象的相等性,或者使用difflib库进行文本比较;在C语言中,可以使用memcmp函数进行内存块的快速比较。 用户可能需要代码示例,因此我需要提供不同语言下的实现方法。例如,在Python中,逐字节比较可以通过遍历每个字节来实现,而哈希比较可以使用hashlib库生成MD5哈希值进行比较。 还需要注意性能问题,特别是当缓冲区较大时,逐字节比较可能较慢。此时,可以结合哈希比较先判断是否相同,若不同再进一步分析差异。此外,内存效率也是一个考虑因素,应避免将整个缓冲区加载到内存中处理,特别是处理大文件时。 最后,根据用户的问题,他们可能想了解如何实现这些比较方法,或者使用哪些工具/库。因此,回答需要包括具体步骤、代码示例以及可能的优化方法。</think>要计算两个缓冲区(buff)之间的差异,可以根据数据类型和需求选择以下方法: --- ### 一、逐字节比较(适用于二进制数据) 直接对比每个字节的值,记录差异的位置和内容。 1. **检查长度是否一致**:若长度不同,直接判定为不同。 2. **逐字节遍历**:若长度相同,逐个比较字节值。 ```python def compare_buffers(buff1, buff2): if len(buff1) != len(buff2): return "长度不同" differences = [] for i in range(len(buff1)): if buff1[i] != buff2[i]: differences.append((i, buff1[i], buff2[i])) return differences ``` --- ### 二、哈希快速比对(判断是否完全相同) 使用哈希算法(如MD5)快速判断两个缓冲区是否一致: ```python import hashlib def hash_compare(buff1, buff2): hash1 = hashlib.md5(buff1).hexdigest() hash2 = hashlib.md5(buff2).hexdigest() return hash1 == hash2 # True表示完全相同 ``` --- ### 三、文本内容差异(适用于字符串) 使用文本差异算法(如最长公共子序列)生成修改记录: ```python import difflib def text_diff(buff1, buff2): d = difflib.Differ() diff = list(d.compare(buff1.decode().splitlines(), buff2.decode().splitlines())) return '\n'.join(diff) ``` --- ### 四、相似度计算 统计相同字节的比例,计算相似度: ```python def similarity(buff1, buff2): min_len = min(len(buff1), len(buff2)) match = sum(b1 == b2 for b1, b2 in zip(buff1[:min_len], buff2[:min_len])) return match / max(len(buff1), len(buff2)) * 100 # 百分比 ``` --- ### 五、内存高效比对(大文件场景) 使用内存映射或分块读取,避免一次性加载大文件: ```python def file_compare(file1, file2, chunk_size=4096): with open(file1, 'rb') as f1, open(file2, 'rb') as f2: while True: b1 = f1.read(chunk_size) b2 = f2.read(chunk_size) if b1 != b2: return False if not b1: return True ``` --- ### 总结 | 方法 | 适用场景 | 优点 | 缺点 | |--------------|------------------------|--------------------------|--------------------------| | 逐字节比较 | 二进制数据精确比对 | 详细差异记录 | 速度慢(大文件不适用) | | 哈希比对 | 快速验证一致性 | 高效 | 无法定位具体差异 | | 文本差异 | 字符串内容修改分析 | 可读性强 | 仅限文本 | | 相似度计算 | 近似匹配 | 量化差异程度 | 不适用于结构化差异 | | 内存高效比对 | 大文件 | 节省内存 | 需分块处理 | --- ### 相关问题 1. **如何优化大缓冲区差异计算的性能?** - 分块处理、行计算或使用哈希预筛选[^2]。 2. **如何生成差异报告的可视化结果?** - 使用`difflib.HtmlDiff`生成HTML格式的差异对比[^1]。 3. **在内存受限时如何比较超大缓冲区?** - 采用流式读取或内存映射技术[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值