es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, vamos a analizar el código que proporcionaste:

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

    Hay varios problemas con este código:

    • La línea T max = (T) list no tiene sentido, ya que no puedes convertir un List a un tipo genérico T. Necesitas inicializar max con el primer elemento de la lista, así: T max = list.get(0).
    • El operador > no está definido para Object, 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 interfaz Comparable, para poder usar el método compareTo para comparar los elementos. Puedes lograr esto reemplazando el límite superior List<? extends Object> con List<? extends Comparable<? super T>>.
    • Estás devolviendo max directamente, sin envolverlo en un objeto Opt. Necesitas crear un objeto Opt a partir de max antes de devolverlo.

    Teniendo en cuenta estos problemas, aquí tienes una implementación corregida:

    public static <t extends=""></t><? super T>> Opt<t> max(List<? extends T> list) {
        if (list.isEmpty()) {
            return Opt.empty();
        }
        T max = list.get(0);
        for (int i = 1; i < list.size(); i++) {
            T current = list.get(i);
            if (current.compareTo(max) > 0) {
                max = current;
            }
        }
        return Opt.of(max);
    }
    

    Esta implementación utiliza un parámetro de tipo T que extiende Comparable<? super T>, lo que significa que cualquier parámetro de tipo utilizado para este método debe implementar la interfaz Comparable (que define el método compareTo). 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, inicializa max con el primer elemento de la lista y itera sobre los elementos restantes, actualizando max si se encuentra un elemento mayor. Finalmente, crea un objeto Opt a partir de max y lo devuelve.

    Con esta implementación en su lugar, la salida esperada debería ser:

    El valor máximo: ghh
    El valor máximo: 456
    El valor máximo: 456.001</t></t></t></t>
    

Comments are closed.