哪种 Java 集合认为排列是相等的?

2024-04-12

我想创建可能包含重复值的集合,没有特定的顺序。

换句话说:

{ 1, 1, 2 } == { 2, 1, 1 } == { 1, 2, 1 }

事实上,我想要一组这些集合,所以如果我尝试添加这两个集合{ 1, 1, 2 } and { 2, 1, 1 }, 第二.add()实际上不会做任何事情。

是否有一个标准集合已经具有这种行为方式?

如果我理解正确的话:

  • ArrayList允许重复值,但有固定的顺序
  • HashSet 允许任意顺序但不允许重复值
  • TreeSet 确保顺序不变,但不允许重复值

是否有一个我忽略的集合允许重复值和任意或固定顺序,以便两个具有相同元素的集合被认为是相等的?


@asteri 询问我的用例。在游戏中,我有不同长度的块,可以将它们首尾相连以填充一定的距离。例如,如果距离为10,则可以用2-3-5或5-2-3或3-3-4或3-4-3或任何数量的其他排列来填充。根据可用的块,我想列出所有可能的集合来解决填补空白。


定制解决方案
@sprinter 建议创建 ArrayList 的子类。 @dasblinkenlight 和 @Dici 建议使用 Map 来存储{ Element : Count }条目。我选择将这两个建议结合起来。下面是 TreeMap 的子类。键始终以相同的顺序存储,以确保 hashCode() 方法生成相同的值,例如使用相同的键和值。

我用过一个increment方法可以轻松添加特定整数“值”的新出现。

package com.example.treematch;

import java.util.Map;
import java.util.TreeMap;

public class TreeMatch<K> extends TreeMap<K, Integer> {

  @Override
  public boolean equals(Object other) {
    if (this == other) {
      return true;
    }

    if (!(other instanceof TreeMatch)) {
      return false;
    }

    TreeMatch otherMatch = (TreeMatch) other;
    if (size() != otherMatch.size()) {
      return false;
    }

    for (Object key : this.keySet()) {
        if (!otherMatch.containsKey(key)) {
            return false;
        }
    }

    for (Object key : otherMatch.keySet()) {
      if (!this.containsKey(key)) {
        return false;
      }

      if (this.get(key) != otherMatch.get(key)) {
        return false;
      }
    }

    return true;
  }

  public void increment(K key) {
    Integer value;

    if (this.containsKey(key)) {
      value = (this.get(key)) + 1;
    } else {
      value = 1;
    }

    this.put(key, value);
  }


  @Override
  public int hashCode() {
    int hashCode = 0;

    for (Map.Entry entry : this.entrySet()) {
      hashCode += entry.getKey().hashCode();
      hashCode = hashCode << 1;
      hashCode += entry.getValue().hashCode();
      hashCode = hashCode << 1;
    }

    return hashCode;
  }
}

Java 内置库中没有任何内容,但 Guava 的Multiset https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multiset做这个。

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

哪种 Java 集合认为排列是相等的? 的相关文章

  • 用于解析和构建逻辑表达式的 Java 库

    我正在寻找一个 Java 开源库来解析和构建类似 SQL 的表达式 例如评估表达式的有效性 例如 a x or y and b z 另外我想要一个用于构建或扩展表达式的 API 就像是 Expression exp new Expressi
  • java.lang.VerifyError:JVMVRFY012堆栈形状不一致;

    在 WAS 8 5 5 中部署 Maven 项目时出现以下错误 我在WAS中安装了JDK 1 6和1 7 错误500 org springframework web util NestedServletException 处理程序处理失败
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 本地开发的 Azure Functions 扩展包版本问题

    我有一个带有队列触发器的 Java 11 Azure 函数 该函数在部署到 Azure 时按预期工作 并正确从定义的服务总线主题中提取消息 但是 运行相同的功能locally除非我回滚版本 否则不起作用Azure Functions 绑定扩
  • JUnit5 平台启动器 API - 如果没有至少一个测试引擎,则无法创建启动器

    我正在尝试升级我们的自动化测试套件的测试能力以接受 JUnit5 测试并遵循JUnit 平台启动器 API 说明 https junit org junit5 docs current user guide launcher api我收到错
  • 无法从资源加载图片

    So I am trying to load a image file from a resource so that when I export my application into a jar file it could be use
  • java setFullScreenWindow 在 Mac 中隐藏登录对话框

    我使用的是全屏窗口 类似于屏幕保护程序 使用这里的方法 GraphicsEnvironment getLocalGraphicsEnvironment getDefaultScreenDevice setFullScreenWindow t
  • 插入时的 iBatis 判别器

    我有一个抽象类Example以及与之相伴的具体子类 我使用鉴别器来提取数据out数据库的 像这样
  • 纱线上的火花,连接到资源管理器 /0.0.0.0:8032

    我正在我的开发机器 Mac 上编写 Spark 程序 hadoop的版本是2 6 spark的版本是1 6 2 hadoop集群有3个节点 当然都在linux机器上 我在idea IDE中以spark独立模式运行spark程序 它运行成功
  • 如何从intellij项目视图中隐藏不必要的文件?

    给定一个示例 gradle 项目 其项目结构如下所示 正如你所看到的 有很多东西你实际上不需要在想法中看到 但你需要它们存在 我知道下面被忽略的文件 文件夹类型Editor File Types但这些正在影响库和项目 idea 会在各处忽略
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • spring data jpa复合键重复键记录插入导致更新

    我有一个具有复合键的实体 我试图通过使用 spring data jpa 存储库到 mysql 数据库来持久化它 如下所示 Embeddable public class MobileVerificationKey implements S
  • 如何使用自定义 JDK 构建 Jenkins 项目?

    我有一个常规的 Jenkins 实例 运行一些多分支管道 该实例在 JDK 11 上运行 因为 Jenkins 并不真正支持更高版本 没关系 但不好的是 我的所有管道似乎也都受到 Java 11 的限制 Jenkins 仅使用它自己也使用的
  • 如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

    使用 Apache commons net 的 Java FTPSClient 进行会话恢复是一个已知问题 会话恢复是 FTPS 服务器数据连接所需的一项安全功能 Apache FTPSClient 不支持会话恢复 并且 JDK API 使
  • Errors/BindingResult 参数应在模型属性、@RequestBody 或 @RequestPart 参数之后立即声明

    我通过剖析示例应用程序来自学 Spring 然后到处添加代码来测试我在剖析过程中开发的理论 在测试添加到 Spring 应用程序中的一些代码时 我收到以下错误消息 An Errors BindingResult argument is ex
  • mybatis:使用带有 XML 配置的映射器接口作为全局参数

    我喜欢使用 XML 表示法来指定全局参数 例如连接字符串 我也喜欢 Mapper 注释 当我尝试将两者结合起来时 我得到这个例外 https stackoverflow com questions 4263832 type interfac

随机推荐

  • .NET:如何有效地检查 50,000 个项目的 List 中的唯一性?

    在某些库代码中 我有一个可以包含 50 000 个或更多项目的列表 库的调用者可以调用导致将字符串添加到列表中的方法 如何有效地检查所添加字符串的唯一性 目前 在添加字符串之前 我会扫描整个列表并将每个字符串与要添加的字符串进行比较 当超过
  • 结构有对象且无法复制

    我正在尝试从我的第一个 MQL4 专家顾问开始 我创建了一个struct处理我的订单 struct Order int pair int command double quantity double entry double stopLos
  • 从 GPS 点绘制线

    我有大约 100 个 GPS 坐标列表 我想画出每个列表所构成的线 使用散点图绘制的列表之一 看起来有点像这样 显然那里有一条线 我尝试了几种方法来对 GPS 位置进行排序并绘制它们 lats lngs with open filename
  • MSMQ如何管理消息?

    看来MSMQ不使用任何数据库管理系统来管理消息 MSMQ如何管理消息 它将消息存储在平面文件中吗 我正在尝试实现一个消息管理系统 MSMQ 使用位于 windir system32 msmq 中的平面文件 如果你想实现自己的队列 我建议你看
  • 反序列化 json 数组以列出 wp7

    我需要从 json 内的子数组获取数据 但它没有转换成列表 下面是我的 json 字符串 responseCode 0 responseObject TotalRecords 25 TotalDisplayRecords 25 aaData
  • 如何使用 Ninject InRequestScope 处理异步调用?

    我们正在使用Ninject in an ASP NET Web API应用程序 然后我们绑定我们的DbContext with InRequestScope 这对于我们的大多数请求都很有效 因为它们同步完成所有工作 因此可以在请求完成后安全
  • 精确存储大整数

    在R软件中 a lt 123456789123456789123456789 sprintf 27f a 1 123456789123456791337762816 000000 我得到了错误的答案 我想要准确的a value 为什么系统显
  • Spring Batch 框架 - 自动创建批处理表

    我刚刚使用 Spring Batch 框架创建了一个批处理作业 但我没有运行 CREATE SQL 的数据库权限 当我尝试运行批处理作业时 框架尝试创建 TABLE BATCH INSTANCE 时遇到错误 我尝试禁用
  • 如何在 Julia 中提供可重现的样本数据

    Here on stackoverflow com 当我提供样本数据来制作可重现的示例时 我该如何以朱利安方式做到这一点 In R例如dput df 将输出一个字符串 您可以用它来创建df再次 因此 您只需将结果发布到 stackoverf
  • 当日期是日期时间且时间是字符串时,合并日期和时间

    我正在使用一个旧的 mysql 数据库 其中日期存储 没有时间 作为日期时间 时间存储为字符串 没有日期 在 C 中 我有一个 DateTime 其值类似于2010 06 25 12 00 00 AM和一个具有如下值的字符串15 02 在没
  • 禁用 Oracle 中所有作业的脚本(DBMS_JOB 包)?

    我正在寻找一个禁用所有作业的脚本 现在 我在 Toad 中将它们全部突出显示 单击脱机按钮 然后提交更改 在 PL SQL 中必须有一种方法来做到这一点 如果要阻止所有作业运行 可以更改初始化参数JOB QUEUE PROCESSES 如果
  • 避免在处理 config.properties 的 Java 类文件中使用静态方法和变量

    我正在开发一个简单的 Java 应用程序 并且创建了一个名为 Config java 的类来处理应用程序属性 从而避免硬编码 Config java 类不是静态类 我正在另一个名为 Serial java 的类中创建 Config java
  • 死信交换 RabbitMQ 丢弃消息

    我正在尝试在 RabbitMQ 中实现 dlx 队列 场景很简单 我有 2 个队列 1 活着 2 死亡 x dead letter exchange 立即 x message ttl 5000 以及 立即 交换 这必然是 1 活着 我尝试运
  • 当终端大小调整时,Ncurses 程序退出

    当我调整终端窗口大小时 以下程序退出 为什么以及如何阻止它 include
  • 如何在java程序中获取kafka消耗滞后

    我写了一个java程序来消费来自kafka的消息 我想监控消费延迟 如何通过java获取它 顺便说一句 我用
  • Java如何检测文件变化

    有没有办法以某种方式触发一个事件 每次文件更改时都会执行某些操作 我的意思是类似的东西 用伪代码 if DetectedFileModified pathToFile do stuff 我知道我可以定期执行此操作 但我可以在没有计时器的情况
  • PHP Imagick如何最适合文本注释

    我正在将注释文本添加到 newPseudoImage 中 该图像工作正常 但我想让文本缩放以适应图像大小 我有什么想法可以做到这一点吗 im new Imagick draw new ImagickDraw draw gt setFillC
  • 请告诉我如何打开4d数据库?

    我尝试打开 使用 4d v12 扩展名为 4dc 的数据库 此外还有扩展名为 4dd 和 4dr 的文件 结果是错误 您无法转换已编译的数据库 也许这是数据库的旧版本 但我找不到任何可以将其转换为新版本的内容 我的目标是从数据库中获取信息
  • Android 应用无法获取位置权限

    我的清单中有以下内容
  • 哪种 Java 集合认为排列是相等的?

    我想创建可能包含重复值的集合 没有特定的顺序 换句话说 1 1 2 2 1 1 1 2 1 事实上 我想要一组这些集合 所以如果我尝试添加这两个集合 1 1 2 and 2 1 1 第二 add 实际上不会做任何事情 是否有一个标准集合已经