【问题标题】:Select max from a List using Generics使用泛型从列表中选择最大值
【发布时间】:2022-01-02 20:07:56
【问题描述】:

我必须编写一个从列表中选择最大值的方法,并且必须使用泛型。显然,列表也可以是数字和字符串。 (返回值必须是 Opt 对象。这是任务。)

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

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

【问题讨论】:

  • 您遇到了哪些不明白的错误?
  • 请更具体地提出问题。哪个部分不工作?
  • 1. Opt 是您必须创建的类型还是 Optional 的拼写错误版本? 2. 不能声明参数List&lt;? extends Object&gt; list(任意事物的列表)并承诺返回Opt&lt;T&gt;特定类型的可选值)。您应该使用参数List&lt;T&gt; list 来声明列表元素的类型必须与返回类型相对应。然后,您不需要那些 (T) 类型转换。此外,您不能仅通过转换 T 值来创建 Opt&lt;T&gt;

标签: java list generics max optional


【解决方案1】:

通过为您完成所有工作,使用 Streams 变得非常容易:

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

Collections 实用函数类:

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()));
    }
}

【讨论】:

    【解决方案2】:

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

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

    在Java中,没有overloaded operators as in C++,所以你需要另寻他法……

    Opt 你可能指的是java.util.Optional 类,你可以像这样使用它:

        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;
        }
    

    这当然不行,它返回列表中的最后一个元素。

    当类的创建者期望用户可能对排序(比较)感兴趣时,他们将实现 java.lang.ComparableStringLongDouble 就是这种情况。因此,您可以这样说 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.Objects 的列表一起使用):

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

    以及为什么我们在 addTo 中不需要它:

    public static <T> void addTo(List<T> list, T e) {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多