我必須撰寫一個從串列中選擇最大值的方法,并且它必須與泛型一起使用。顯然,串列也可以是數字和字串。(回傳值必須是 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
uj5u.com熱心網友回復:
通過為您完成所有作業,使用 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()));
}
}
uj5u.com熱心網友回復:
由于這一行,您的代碼無法正常作業(我的意思是無法編譯):
if (list.get(i) > max) {
在 Java 中,沒有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.Comparable就是這種情況。因此,您可以這樣說,而不是 T :StringLongDoubleT extends Comparable
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) {
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405265.html
標籤:
