【问题标题】:Java collection filter comparatorJava 集合过滤器比较器
【发布时间】:2017-04-22 21:07:13
【问题描述】:

我被要求实现一个包含 1 个方法的 java 库模块,该方法能够使用用户定义的过滤器方法过滤任意对象的集合并返回对象的标识哈希码(JVM 生成的对象的唯一哈希码) ,最好使用 Java 8 结构。如果找到多个对象,则应返回最大的一个。如果比较器没有对它们进行唯一排序,则应返回最大的哈希码。该方法应遵循您可以在下面找到的签名。

public <T> Optional<Integer> getIt(Collection<T> collection, Predicate<T> filter, Comparator<T> comparator)

所以,我想先过滤,使用:

collection.removeIf(filter.negate());

但是,我无法得到的是,你怎么能得到最大的任意对象?

感谢任何帮助,谢谢

【问题讨论】:

    标签: java collections comparator predicate


    【解决方案1】:

    您需要将过滤后的集合放在ArrayList 中,然后对其调用接受比较器的sort() 方法。

    但是,您不能使用提供的比较器,因为根据问题的定义,它可能不会对您的对象进行唯一排序。因此,您需要提供自己的比较器,它执行以下操作:

    首先它调用提供的比较器;如果它返回零以外的值,则返回该结果。如果提供的比较器返回零,则计算两个对象的标识哈希码,比较两个哈希码,然后返回比较的结果。

    【讨论】:

      【解决方案2】:

      Streams API 确实使解决方案相对简单:

      public <T> Optional<Integer> getIt(Collection<T> collection, Predicate<T> filter, Comparator<T> comparator) {
          return collection.stream()
              .filter(filter)
              .max(comparator.thenComparingInt(System::identityHashCode))
              .map(System::identityHashCode);
      }
      

      编辑:评论者Mike Nakis 向我指出,这个问题很可能属于“家庭作业帮助”类别,我自己在第一遍时就错过了这一观察。如果您确实在课堂作业上寻求帮助,请诚实地使用此线程上的解决方案。与往常一样,Stack Overflow 的答案需要注明出处,无论您提交的任何代码都至少应该提供一个指向此问题的链接,说明您遇到问题并寻求帮助。

      【讨论】:

      • 1.用实际代码回答家庭作业问题在道德上是有问题的。 2. 您的流解决方案令人印象深刻,但如果 OP 将其提交,他的教授会立即知道是其他人为他编写的。
      • 然后,问题又说“最好使用 java 8 构造”,因此流解决方案可能是预期的。但是,用代码回答家庭作业问题仍然很糟糕。
      • @MikeNakis 再看这个问题,这似乎有点像家庭作业帮助。在最初通过时,它看起来像是雇主的要求,但我想我扫描得太快了。
      • 谢谢大家,这不是课堂作业,而是工作作业:)。我的问题与知道如何按最大/最大对象排序更相关。所以,我正在寻找的是内存中对象的大小。
      • @teqany 那你为什么要给我们提供一个函数签名,这样与内存使用完全无关?我很难相信你的故事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多