Метод, который возвращает максимум 2D-массива Java - PullRequest
1 голос
/ 19 апреля 2020
public static <E extends Comparable<E>> E getMaxElement(E[][] list){
    E theMaximumElement = new E();
    for (int i = 0; i <list.length ; i++) {
        for (int j = 0; j <list[i].length ; j++) {

            if(theMaximumElement.compareTo(list[i][j]))
                theMaximumElement = list[i][j];
        }
    }
    return theMaximumElement;
}

Как я могу написать этот код хорошо? Это правда?

Я хочу найти максимальный элемент. Я не очень хорош в Generics в java.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

В вашем коде есть две проблемы:

  • Метод Comparable::compareTo не возвращает boolean, но int. Вот описание метода:

    Сравнивает два аргумента для порядка. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равен или больше второго. В вышеприведенном описании обозначение sgn (выражение) обозначает математическую функцию signum, которая определена для возврата одного из -1, 0 или 1 в зависимости от того, является ли значение выражения отрицательным, нулевым или положительным.

  • Вы не можете создать экземпляр объекта c, например new E(). Отметьте Тип экземпляра генериков в java.

Это способ go:

public static <E extends Comparable<E>> E getMaxElement(E[][] list) {

    E theMaximumElement = list[0][0];                // initial value (the first one)
    for (final E[] array : list) {
        for (final E e : array) {
            if (theMaximumElement.compareTo(e) < 0)  // comparison is against 0
                theMaximumElement = e;               // setting the new maximum value
        }
    }
    return theMaximumElement;                        // returning it
}

Единственное условие заключается в том, что элемент list[0][0] существует, то есть массивы не пусты. В противном случае вам следует изменить решение для использования Optional<E>, поскольку максимум не всегда найден (пустые массивы).

Начиная с Java 8, существует простой способ обработки таких случаев использования с помощью :

Optional<E> optionalmaximum = Arrays.stream(list)                    // Stream<E[]>
                                    .flatMap(Arrays::stream)         // Stream<E>
                                    .max(Comparator.naturalOrder()); // Optional<E>
2 голосов
/ 19 апреля 2020

Это моя версия:

public static <E extends Comparable<E>> E getMaxElement(E[][] list) {
    if (list.length <= 0)
        return null;

    E theMaximumElement = list[0][0];

    for (int i = 0; i < list.length; i++)
        for (int j = 0; j < list[i].length; j++)
            if (list[i][j].compareTo(theMaximumElement) > 0)
                theMaximumElement = list[i][j];

    return theMaximumElement;
}
0 голосов
/ 19 апреля 2020

Я думаю, что этот кусок кода будет работать, чтобы получить максимум.

 public static <E extends Comparable<E>> E max(E[] list) {

    E max = list[0];
    for (int i = 1; i < list.length; i++) {
        E element = list[i];
        if (element.compareTo(max) > 0) {
            max = element;
        }
    }

    return max;
}
...