Seleccionar el máximo de una lista utilizando Genéricos
Tengo que escribir un método que seleccione el valor máximo de una lista, y tiene que ser con Genericos. Obviamente, la lista también puede ser de tipo Number o String. (El valor de retorno tiene que ser un Objeto Opt. Esta es la tarea.)
Esto es lo que tengo hasta ahora, pero no está funcionando, agradecería su consejo:
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;
}
Y esto es cómo se ve el main: (A partir de este, tengo que hacer que mi método funcione.)
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("El valor máximo: " + 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("El valor máximo: " + 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("El valor máximo: " + Utility.max(doubleList).get());
}
Y la salida debería ser:
El valor máximo: ghh
El valor máximo: 456
El valor máximo: 456.001
davy.ai
En primer lugar, vamos a analizar el código que proporcionaste:
Hay varios problemas con este código:
T max = (T) list
no tiene sentido, ya que no puedes convertir unList
a un tipo genéricoT
. Necesitas inicializarmax
con el primer elemento de la lista, así:T max = list.get(0)
.>
no está definido paraObject
, que es el límite superior de la lista de entrada. Necesitas asegurarte de que la lista de entrada extienda un tipo que implemente la interfazComparable
, para poder usar el métodocompareTo
para comparar los elementos. Puedes lograr esto reemplazando el límite superiorList<? extends Object>
conList<? extends Comparable<? super T>>
.max
directamente, sin envolverlo en un objetoOpt
. Necesitas crear un objetoOpt
a partir demax
antes de devolverlo.Teniendo en cuenta estos problemas, aquí tienes una implementación corregida:
Esta implementación utiliza un parámetro de tipo
T
que extiendeComparable<? super T>
, lo que significa que cualquier parámetro de tipo utilizado para este método debe implementar la interfazComparable
(que define el métodocompareTo
). Esto es necesario para comparar los elementos de la lista de entrada.El método primero verifica si la lista de entrada está vacía, en cuyo caso devuelve un objeto
Opt
vacío (que representa un valor que puede o no estar presente). De lo contrario, inicializamax
con el primer elemento de la lista y itera sobre los elementos restantes, actualizandomax
si se encuentra un elemento mayor. Finalmente, crea un objetoOpt
a partir demax
y lo devuelve.Con esta implementación en su lugar, la salida esperada debería ser: