【问题标题】:How to use `Collections.min()` on custom collection?如何在自定义集合上使用`Collections.min()`?
【发布时间】:2018-06-05 16:10:13
【问题描述】:

我编写了一个名为MySet<T> 的自定义集合,它本质上是HashSet 的包装器:

import java.util.Collections;
import java.util.HashSet;

public class MySet <T> {
    private HashSet<T> set;

    public MySet() {
        this.set = new HashSet<>();
    }

    public MySet(T[] elements) {
        this.set = new HashSet<>();
        Collections.addAll(this.set, elements);
    }
    public HashSet<T> getSet() {
        return this.set;
    }
}

它包含与 union()intersect() 等集合相关的方法。

我还写了一个名为Person 的类,它代表了一个人的基本细节并实现了Comparable 接口:

public class Person implements Comparable<Person> {
    private int id;
    private String name;
    private int age;

    public Person(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    private boolean equals(Person p) {
        return this.age == p.age;
    }

    public int compareTo(Person p) {
        return this.age - p.age;
    }
}

我们根据age 字段比较Person 对象。

需要编写第三个类,它只具有接收MySet&lt;Person&gt; 对象并确定最小Person 的方法。当然,这可以通过使用两个循环来找到最小年龄来手动完成,但重点是使用 Java 方法进行泛型,所以我虽然在 MySet&lt;Person&gt; 上使用 Collections.min()

public class MinimumClass<T> {
    public T minElement(MySet<T> set) {
        Collections.min(set);
    }
}

不编译并给出错误:no instance(s) of type variable(s) T exist so that MySet&lt;T&gt; conforms to Collection&lt;? extends T&gt; 据我了解,这意味着我必须在MySet 中实现Collection 接口。

有没有更简单的方法来编写确定最小人员的方法,使用Person 实现ComparableMySet 是一个泛型类这一事实?

【问题讨论】:

  • 您为什么要避免使用MySet 实现Collection 接口?
  • @Mureinik 因为我必须实现 10 种方法才能只使用一种方法。
  • 您可以将它们全部委托给底层Set...无论如何-有没有办法从MySet取回元素?你分享的 sn-p 没有显示。
  • @Mureinik 是的,我有 getSet()method,我编辑了 OP 以添加它

标签: java generics collections comparison min


【解决方案1】:

由于HashSetCollection,您可以直接调用Collections.min。请注意,您应该将其限制为 ComparableTs,以便使用 Collections.min

public class MinimumClass<T extends Comparable<T>> {
    public T minElement(MySet<T> mySet) {
        return Collections.min(mySet.getSet());
    }
}

【讨论】:

  • 此代码无法编译并返回与 OP 中相同的错误。
  • @STaefi 添加return 语句后仍然无法编译
  • @Yos:我知道,我刚才提到了代码中的错误。
  • @Yos 被抓到了,我很抱歉。已编辑和修复。
  • @STaefi 被抓到了,我很抱歉。已编辑和修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多