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.Comparable
,String
、Long
就是这种情况和 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()));
}
}
我必须编写一个从列表中选择最大值的方法,并且必须使用泛型。显然,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.Comparable
,String
、Long
就是这种情况和 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()));
}
}