如何使用自定义 Comparator 或 equals 方法查找 Set 差异?

2024-02-11

我想找到两者之间的区别Set<T>使用与类所使用的不同的平等度量T,例如自定义Comparator<T>

例如,我有一堂课Animal,通常使用物种来测试平等Animal

public class Animal {
    public String species;
    public String genus;

    public Animal(String species, String genus){
        this.species = species;
        this.genus = genus;
    }

    public boolean equals(Animal other){
        return other.species.equals(this.species);
    }
}

我有两个List<Animal>我想找到两个列表之间共享属的交集。

通常,我会转换List to Set并使用retainAll https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#retainAll(java.util.Collection)找到交点。但在这里,这将给出共享物种的交集,而不是共享属的交集。

我想用类似的东西GenusComparator定义交集的相等性。

public class GenusComparator implements Comparator<Animal>{

    @Override
    public int compare(Animal animal1, Animal animal2) {
        return String.CASE_INSENSITIVE_ORDER.compare(animal1.genus, animal2.genus);
    }

}

这只是一个简单的示例来解释我想要做什么,而不是我的应用程序中的实际类。

我发现的两种可能的解决方案是

  1. 包装类并重写 equals 方法
  2. Use a TreeSet https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html使用自定义比较器

到目前为止我还错过了其他方法吗?这些解决方案可能有哪些优点和缺点?


最简单的方法是简单地使用TreeSetGenusComparator.

您必须将两组都转换为TreeSet(GenusComparator)为了retainAll()才能正常工作。

I fixed equals()并添加了hashCode() and toString().

public class Test {
    public static void main(String[] args) {
        Set<Animal> set1 = new HashSet<>(Arrays.asList(new Animal("Jaguar", "Panthera"),
                                                       new Animal("Margay", "Leopardus"),
                                                       new Animal("Tiger", "Panthera")));
        Set<Animal> set2 = new HashSet<>(Arrays.asList(new Animal("Bobcat", "Lynx"),
                                                       new Animal("Cougar", "Puma"),
                                                       new Animal("Leopard", "Panthera")));
        TreeSet<Animal> treeSet1 = new TreeSet<>(new GenusComparator());
        treeSet1.addAll(set1);
        TreeSet<Animal> treeSet2 = new TreeSet<>(new GenusComparator());
        treeSet2.addAll(set2);
        treeSet1.retainAll(treeSet2);
        System.out.println(treeSet1);
    }
}
class Animal {
    public String species;
    public String genus;

    public Animal(String species, String genus) {
        this.species = species;
        this.genus = genus;
    }
    @Override
    public boolean equals(Object obj) {
        return obj instanceof Animal && this.species.equals(((Animal)obj).species);
    }
    @Override
    public int hashCode() {
        return this.species.hashCode();
    }
    @Override
    public String toString() {
        return this.species + "/" + this.genus;
    }
}
class GenusComparator implements Comparator<Animal> {
    @Override
    public int compare(Animal animal1, Animal animal2) {
        return String.CASE_INSENSITIVE_ORDER.compare(animal1.genus, animal2.genus);
    }
}

Output

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

如何使用自定义 Comparator 或 equals 方法查找 Set 差异? 的相关文章

随机推荐

  • 如何使用 Jasmine 监视在另一个方法中创建的对象?

    给定以下代码片段 您将如何创建一个Jasmine http jasmine github io 2 0 introduction html spyOn测试以确认doSomething当你跑步时被呼叫MyFunction function M
  • Visual Studio Code 中的方法列表

    我最近开始使用 Visual Studio Code 编辑器 我真的很喜欢它 但是 对我来说 有一个关键功能我还没有找到 是否有一个方法列表 类似于 NetBeans 中的导航器或 Visual Studio 中的成员下拉列表 Yes th
  • 自定义 iPhone 返回键文本

    是否可以设置自定义返回键类型UITextField txtField setReturnKeyType UIReturnKeyDefault 我想用 SHARE 一词代替返回键类型 Thanks 没有 您可以获得操作系统中定义的返回键和键盘
  • Websocket 多通道与单通道 + 服务器端处理 [GroupChat]

    假设我们想要创建私人聊天室 用户可以在其中进行小组聊天 一个用户可以加入多个 x组 在每种情况下 我都需要在服务器上创建一个唯一的组并向用户订阅这些组 哪种方法是推荐的 性能更高的方法 1 在服务器端 我创建一个 Room 类并添加新房间c
  • 根据另一个关联数组的值构建关联数组

    我正在寻找一种优雅的方式来转动这个数组 Array foo gt 1 bar gt 1 zim gt 3 dib gt 6 gir gt 1 gaz gt 3 进入这个数组 Array 1 gt Array foo bar gir 3 gt
  • 移动跨平台开发的限制[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 目前 我计划将 Java 桌面应用程序移植到 Android 平台 除了官方安卓软件开发工具包 http developer andr
  • 使用 C# 和 JScript 汇总表

    我用 C 编写了代码来总结以下值InvoiceTable并将这些汇总值移至GroupTable在 Abbyy FlexiCapture 中 该软件比较新 运行时没有显示任何错误 需要写两套代码 在科技领域 在事件处理程序中 InvoiceT
  • vuetify中关闭芯片时如何停止选择打开?

    对于来自 vuetify com 的示例 使用芯片自动完成 当我取消芯片时 如何让它不打开选择菜单 i tried click stop 但它不起作用 芯片上事件 Thanks 我发现如果你删除box来自你的支撑v autocomplete
  • .NET Core 中带参数的自定义 JsonConverter

    我编写了自己的 JsonConverter 使用 ASP Net Core 3 1 打算在我的 DTO 上使用它 在以前的版本中 Newtonsoft Json 您可以在自定义 JsonConverter 类上添加构造函数 并使用 Json
  • EntityFramework 类在更新后被删除?

    我更改了数据库模型 以便其中一个表外键接受空值 之后我去了我的 edmx文件并执行 从数据库更新模型 保存后 代表表的所有类文件都被自动删除 如果我恢复数据库中的更改并重新保存我的 edmx 类将重新出现 但我真的希望这个外键能够接受空值
  • 为什么所有Powershell输出没有写入txt文件

    我在 Powershell Core 中运行以下 Powershell 脚本 PS C gt Get ChildItem Recurse File Filter pbix Sort Object Property LastAccessTim
  • 上传到 S3 时 Lambda 函数超时

    我有一个用 python 编写的 lambda 函数 它在 mongodb 中执行一些操作 然后它应该将函数的 tmp 文件夹中的图片上传到 s3 上 该函数在上传步骤中不断超时 我将超时设置为 2 分钟 并且该函数具有 S3 和 vpc
  • 更改 jQuery UI 按钮大小?

    我一直在我的页面上使用 jQuery UI 按钮 但是我还没有找到解决这个看似简单问题的方法 我希望我的一些按钮比其他按钮小 这应该像将按钮文本的 CSS 设置为类似的内容一样简单 font 8em 然而 jQuery UI 获取你的 DO
  • SQL Server 2005的默认并发控制

    SQL Server 2005 的默认并发控制是什么 是乐观并发控制还是悲观并发控制 这个可以设置吗 感谢期待 悲观 似乎是 2005 年的默认设置 尽管可以根据需要激活快照隔离 在默认的悲观模型中 第一个写入者将阻止所有后续写入 作家 但
  • PreventDefault 不适用于焦点事件

    我正在尝试设计一种表单 如果它具有特定的类 则用户应该无法与任何输入进行交互 由于各种原因 我想避免使用 disabled 属性 我试图阻止焦点事件的默认设置 但它不起作用 我在最新版本的 Firefox Chrome 和 Android
  • TFS 签入成功后清除“评论”字段吗?

    在 Visual Studio 2013 中 是否可以让 TFS 在成功签入后自动清除 注释 字段 在 待更改 面板上 目前 我只是在每次签到后手动突出显示并删除评论字段文本 下面的例子 在我的签到中添加了评论 希望在成功签入后看到这一点
  • 不使用 ContentProvider 时使用 CursorLoader

    Android SDK 文档说startManagingCursor 方法已弃用 此方法已被弃用 使用新的 CursorLoader 类和 LoaderManager 代替 这也可以通过 Android 兼容包在旧平台上使用 此方法允许活动
  • 如何为 R 中使用 grid.arrange() 创建的每一列指定标题?

    有谁知道是否可以在使用 grid arrange 创建的图表的每一列上给出标题 我知道可以为每个图表提供总体标题和标题 但我只需要一个列标题 非常感谢 grid arrange c1b c2a c3d c2b c3a c2d c3b c1a
  • 使用 Laravel Envoy 部署到具有不同项目根的多个服务器

    使用 Laravel Envoy 部署到多个服务器时 如何指定每个服务器的项目根目录 文档中提供的示例假设项目根目录对于两台服务器来说是相同的路径 Assume web 1项目根目录为 var html www and web 2项目根目录
  • 如何使用自定义 Comparator 或 equals 方法查找 Set 差异?

    我想找到两者之间的区别Set