如何在自定义集合中使用`Collections.min()`?

时间:2017-12-23 08:51:04

标签: java generics collections comparison min

我写了一个名为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;
    }
}

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

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

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<T> conforms to Collection<? extends T>据我所知,这意味着我必须在Collection中实现MySet接口。

是否有更简单的方法来编写使用Person实现ComparableMySet是通用类的事实来确定最小人的方法?

1 个答案:

答案 0 :(得分:2)

由于function xx { if (!test1) { return failure; } someProcessing(); if (!test2) { return failure; } // Etc... return success; } HashSet,您可以在其上调用Collection。请注意,为了使用Collections.min,您应将其限制为T Comparable

Collections.min