Select 使用泛型的列表中的最大值

Select max from a List using Generics

我必须编写一个从列表中选择最大值的方法,并且必须使用泛型。显然,List 也可以是 Number 和 String。 (return 值必须是 Opt Object。这是任务。)

这是我目前所拥有的,但它不起作用,非常感谢您的建议:

public static <T> Opt<T> max(List<? extends Object> list) {
    T max = (T) list;
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i) > max) {
            max = (T) list.get(i);
        }
    }
    return (Opt<T>) max;
}

这是主要的样子:(从这个开始我必须让我的方法起作用。)

public static void main(String[] args) { 
   
List<String> stringList = new ArrayList<>();
    Utility.addTo(stringList, "aghi");
    Utility.addTo(stringList, "fed");
    Utility.addTo(stringList, "ghh");
    Utility.addTo(stringList, "abc");
    Utility.addTo(stringList, "123");
    System.out.println("The maximum value: " + Utility.max(stringList).get());

List<Integer> intList = new ArrayList<>();
    Utility.addTo(intList, 123);
    Utility.addTo(intList, 456);
    Utility.addTo(intList, -199);
    Utility.addTo(intList, -90);
    Utility.addTo(intList, 0);
    Utility.addTo(intList, -10);
    Utility.addTo(intList, 200);
    System.out.println("The maximum value: " + Utility.max(intList).get());

List<Double> doubleList = new ArrayList<>();
    Utility.addTo(doubleList, 123.0);
    Utility.addTo(doubleList, 456.001);
    Utility.addTo(doubleList, -199.0);
    Utility.addTo(doubleList, -90.90);
    Utility.addTo(doubleList, 0.0);
    Utility.addTo(doubleList, -10.20);
    Utility.addTo(doubleList, 200.1);
    System.out.println("The maximum value: " + Utility.max(doubleList).get());
}

输出应该是:

The maximum value: ghh
The maximum value: 456
The maximum value: 456.001

由于这一行,您的代码无法运行(我的意思是无法编译):

if (list.get(i) > max) {

在Java中没有overloaded operators as in C++,所以你需要另辟蹊径...

Opt 你的意思可能是 java.util.Optional class 你可以这样使用它:

    public static <T> Optional<T> max(List<T> list) {
        Optional<T> max = Optional.empty();
        for (int i = 0; i < list.size(); i++) {
//            if (list.get(i) > max) {
                max = Optional.of(list.get(i));
//            }
        }
        return max;
    }

这当然行不通,它是 returns 列表中的最后一个元素。

当 class 的创建者期望用户可能对排序(比较)感兴趣时,他们会实施 java.lang.ComparableStringLong 就是这种情况和 Double。所以你可以这样说 T extends Comparable 而不是 T:

    public static <T extends Comparable<T>> Optional<T> max(List<T> list) {
        T max = null;
        for (int i = 0; i < list.size(); i++) {
            final T item = list.get(i);
            if (max == null) {
                max = item;
            } else if (max.compareTo(item) < 0) {
                max = item;
            }
        }
        if (max == null) return Optional.empty();
        return Optional.of(max);
    }

看看Comparable#compareTo JavaDoc.

尝试理解这一行的确切含义(以及为什么不能将它与 java.lang.Object 列表一起使用):

public static <T extends Comparable<T>> Optional<T> max(List<T> list) {

以及为什么我们在 addTo:

中不需要它
public static <T> void addTo(List<T> list, T e) {

使用 Streams 为您完成所有工作,让一切变得非常简单:

public static <T extends Comparable<T>> Optional<T> max(List<T> list) {
    return list.stream().max(Comparator.naturalOrder());
}

或效用函数Collections class:

public static <T extends Comparable<T>> Optional<T> max(List<T> list) {
    if (list.isEmpty()) {
        return Optional.empty();
    } else {
        return Optional.of(Collections.max(list, Comparator.naturalOrder()));
    }
}