使用 Comparator 而不是 equals() 比较两个 Java 集合

2023-12-25

问题陈述

我有两个要比较的相同类型对象的集合。在这种情况下,我想根据不考虑的属性来比较它们equals()对于对象。在我的示例中,我使用排名的名称集合,例如:

public class Name {
    private String name;
    private int weightedRank;

    //getters & setters

    @Override
    public boolean equals(Object obj) {
        return this.name.equals(obj.name); //Naive implementation just to show
                                           //equals is based on the name field.
    }
}

我想比较这两个集合来断言,对于位置i在每个集合中,weightedRank该位置的每个名称的值相同。我做了一些谷歌搜索,但没有在 Commons Collections 或任何其他 API 中找到合适的方法,所以我想出了以下方法:

public <T> boolean comparatorEquals(Collection<T> col1, Collection<T> col2,
        Comparator<T> c)
{
    if (col1 == null)
        return col2 == null;
    if (col2 == null) 
        return false;

    if (col1.size() != col2.size())
        return false;

    Iterator<T> i1 = col1.iterator(), i2 = col2.iterator();

    while(i1.hasNext() && i2.hasNext()) {
        if (c.compare(i1.next(), i2.next()) != 0) {
            return false;
        }
    }

    return true;
}

Question

还有其他方法可以做到这一点吗?我是否错过了 Commons Collections 中的一个明显方法?

Related

我也发现了这个问题 https://stackoverflow.com/questions/11758220/a-mechanism-for-having-different-equals-physical-equals-and-logical-equals-on在 SO 上,这很相似,但在这种情况下我认为最重要的是equals()更有意义一点。

Edit

与此非常相似的东西将进入发布版本Apache 共享集合 http://commons.apache.org/proper/commons-collections/在不久的将来(在撰写本文时)。看https://issues.apache.org/jira/browse/COLLECTIONS-446 https://issues.apache.org/jira/browse/COLLECTIONS-446.


你可以用番石榴等价 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Equivalence.html类以解耦“比较”和“等价”的概念。您仍然需要编写接受等价子类而不是 Comparator 的比较方法(AFAIK Guava 没有它),但至少您的代码不会那么混乱,并且您可以根据任何等价标准来比较您的集合。

使用等价包装对象的集合(请参阅等价的包装方法 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Equivalence.html#wrap%28S%29)将类似于sharakan提出的基于适配器的解决方案,但等效实现将与适配器实现解耦,允许您轻松使用多个等效标准。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Comparator 而不是 equals() 比较两个 Java 集合 的相关文章

随机推荐

  • 如何为 JSON 对象设置原型?

    我正在从服务器接收一些 JSON 对象 并且我想将其 类型转换 或 祝福 为具有已定义方法的对象 有没有办法为普通 JSON 对象设置原型 function MyClass someValue this myProperty someVal
  • Firefox 3 窗口焦点和模糊

    窗口 blur 函数 窗口焦点 假 焦点 函数 窗口焦点 真 问题是 在 Firefox 3 中 当我创建新选项卡时 它不会丢失窗口焦点 而在ff2 ie7中确实输了 在 ff3 中 当我选择另一个程序时 它只会失去窗口焦点 有人有解决这个
  • 为什么 reshape2 融化对我来说返回值 = NA?

    为什么重塑2melt return value NA for me 它对我来说适用于 reshape 但不适用于 reshape2 这是一个示例数据文件 station id year month day h1 h2 h3 h4 h5 h6
  • 无法使用 CDK + Lambda 捆绑资产错误

    我有这个项目结构 其中control是我的项目的名称和根 control src control loader gt this has a function inside called also control loader utils s
  • 使用日期时间时 matplotlib“axis.invert_xaxis”崩溃

    如果我运行以下代码 import pandas as pd from datetime import datetime import numpy as np import matplotlib pyplot as plt df pd Dat
  • 如何按时间段对DataFrame进行分组?

    我有来自日志文件的一些数据 并希望按分钟对条目进行分组 def gen date count 10 while count gt 0 yield date event format randint 1 9 source format ran
  • PHP从列表中随机选择

    我目前正在使用随机选择颜色的 PHP 代码 div style background none class post bg thickbox div
  • 在 clojure core.async go-loop 中工作的方式有哪些权衡?

    当我编写更多 core async 代码时 出现的一种非常常见的模式是循环 它在一系列通道上进行切换并执行一些工作来响应消息 例如 go loop state let value task alts tasks work recur sta
  • `alias sudo="sudo "` 是如何工作的?

    研究将当前用户的别名传递给sudo命令 我发现以下内容在 ArchWiki 上 https wiki archlinux org index php Sudo Passing aliases 传递别名 如果您使用很多别名 您可能会注意到它们
  • AS3 按住按钮时连续运行代码 - Air 适用于 iOS/Android

    我正在 Flash CS6 中开发 iOS 游戏 我有一个基本的运动测试Event MOUSE DOWN处理程序 我期望 想要的是 当我将手指按住按钮时 玩家会继续移动 直到我停止触摸屏幕 但发生的情况是 我必须不断地点击才能让玩家保持移动
  • rdtsc乱序执行的解决方案?

    我正在尝试用 rdtsc 替换 clock gettime CLOCK REALTIME ts 来根据 CPU 周期而不是服务器时间来基准代码执行时间 基准测试代码的执行时间对于软件至关重要 我尝试在独立核心上的 x86 64 3 20GH
  • Google Maps API 在距离起点特定距离的路线上显示图标

    我想在谷歌地图上显示虚拟进度 我想显示带有路线的地图 并且在该路线上我想从一开始就在一定距离处显示一个图标 将根据数据计算 该距离可能随时或每天发生变化 具体取决于与沿虚拟路线的进度相关的数据 例如 在从洛杉矶到纽约的路线上 有一天我可能想
  • 从 WinForms 应用程序检测 IE 版本

    是否可以从 WinForms 应用程序检测计算机上安装的 IE 版本 EDIT 1 我特别感兴趣的是确定是否安装了 IE9 可以安装多个 IE 版本 但 IE9 特别导致我的应用程序出现问题 怎么样 string ver new WebBr
  • 从旧的 LFS 存储库迁移到新的 LFS 存储库?

    Bitbucket 服务器上托管有 LFS git 存储库 现在我们需要创建新的 LFS 存储库并将存储库移至具有 LFS 存储的位置 这个怎么做 例如对于普通的回购我们可以这样做 git remote add new NEW REMOTE
  • python 中被覆盖的变量会发生什么?

    我正在编写一些 python 代码来处理大量数据 近 600 万条 在代码中 我使用一个巨大的 for 循环来处理每组 在该循环中 我在每个循环中使用相同的变量并覆盖它们 当我运行该程序时 我注意到运行时间越长 速度就越慢 此外 经过进一步
  • HTML5 Canvas 100% 高度和宽度

    我试图让这个雨滴画布脚本占据 100 的宽度和高度 但我似乎没有做任何事情 我尝试更改 CSS 以及 Canvas 区域的高度 宽度 但它要么没有改变任何内容 要么使它根本不起作用 有一次我尝试了一些实际上使其成为全尺寸的东西 它似乎对雨滴
  • 非托管内存泄漏

    我正在使用一个使用 BitmapSource 的 WPF 应用程序 但我需要进行一些操作 但我需要对 System Drawing Bitmaps 进行一些操作 应用程序运行时的内存使用量会增加 我已将内存泄漏范围缩小到以下代码 priva
  • 如何在不使用 javascript 的情况下使用 css 混合内容相关和百分比高度/宽度 [重复]

    这个问题在这里已经有答案了 我想实现这样的布局 header height is its content dependant its height is not set it is as heigh as its content stret
  • PHP简单的html DOM从html标签中删除所有属性

    html file get html page php foreach html gt find p as tag name attr substr tag name gt outertext 2 strpos tag name gt ou
  • 使用 Comparator 而不是 equals() 比较两个 Java 集合

    问题陈述 我有两个要比较的相同类型对象的集合 在这种情况下 我想根据不考虑的属性来比较它们equals 对于对象 在我的示例中 我使用排名的名称集合 例如 public class Name private String name priv