Получение максимума из списка объектов - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь получить максимум из моего списка стран (например, максимум из него), можно ли попробовать что-то с a для каждого l oop в списке объектов? Я действительно хочу сделать это по максимуму. Я знаю, что метод неправильный, но я пытаюсь кое-что из этого извлечь, чтобы извлечь из него максимум

Вот мой код

class Main {
    public static void main(String args[]) {
        Measurable[] countries = new Measurable[3];
        countries[0] = new Country("Uruguay", 176220);
        countries[1] = new Country("Thailand", 514000);
        countries[2] = new Country("Belgium", 30510);
        Measurable maximum = maximum(countries);
    }


   public static Measurable maximum(Measurable[] objects) {
        if (objects.length == 0) { return 0; }
        for (Measurable obj : objects)
        {
            int area = obj.getMeasure();
        }

        return area;
    }
}
class Country implements Measurable
{
    private String name;
    private int area;

    public Country(String name, int area)
    {
        this.name = name;
        this.area = area;

    }

    @Override
    public double getMeasure() {
        return area;
    }
}
interface Measurable {
    double getMeasure();
}

Ответы [ 4 ]

1 голос
/ 10 марта 2020

Используя Java 8 Streams, тело вашего maximum() метода может выглядеть следующим образом:

Arrays.stream(objects).max(Comparator.comparingInt(Measurable::getMeasure))

Но имейте в виду, что приведенная выше строка вернет необязательный, поэтому либо измените сигнатуру метода, чтобы он возвращал необязательный, либо (если вы настаиваете на том, чтобы он оставался «как есть»), подумайте, как решить ситуацию, когда необязательного нет (например, вывести исключение или вернуть какой-нибудь фиктивный объект, такой как *) 1007 *.

0 голосов
/ 10 марта 2020

Когда вы хотите получить максимум от некоторого двойного, лучше всего инициализировать значение от max до Double.MIN_VALUE. Таким образом, вы можете быть уверены, что максимум будет получен, даже если он отрицательный (что не будет в данном случае, но это хорошая практика).

Я также думаю, что было бы лучше просто пропустить измеримое интерфейс и использовать страну и доступ к соответствующим значениям соответственно. Поэтому я изменил этот пример, чтобы сделать это.

   public static Country maximum(Country[] objects) {
       if (objects.length == 0) {
                return null; // null for objects.
       }
       double max = Double.MIN_VALUE; 
       Country retVal = null;
       for (Country obj : objects) {
            double area = obj.getMeasure();
            // each time thru, see if current value
            // is greater than current max. If so
            // update the return value and max.
            if  (area > max) {
                 max = area;
                 retVal = obj;
            }
        }
        // return the object with the 
        // largest area.
        return retVal; 
    }

Вы бы назвали это так.

    public static void main(String args[]) {
        Country[] countries = new Country[3];
        countries[0] = new Country("Uruguay", 176220);
        countries[1] = new Country("Thailand", 514000);
        countries[2] = new Country("Belgium", 30510);
        Country maximum = maximum(countries);
    }

Вы все еще можете ссылаться на интерфейс, но имеет больше смысла (imho) используйте «Страна» вместо «Измеримый», потому что я думаю, что вы не хотите просто число, но хотите знать, в какой стране была максимальная площадь.

System.out.println("The largest country was " + maximum.getName());
System.out.println("Its area is " + maximum.getMeasure());

Вам необходимо добавить метод getName() к вашему Country Класс как личное поле без getter не очень полезен.

И вы всегда можете использовать потоки. Вот один из вариантов.

        Country c = Arrays.stream(countries)
                .max(Comparator.comparing(Country::getMeasure))
                .orElseGet(() -> new Country("None Found", -1));

        System.out.println("The largest country was " + c.getName());
        System.out.println("Its area is " + c.getMeasure());
0 голосов
/ 10 марта 2020

При сравнении двух объектов в Java я настоятельно рекомендую разрешить объекту реализовать Comparator (или Comparable). По моему мнению, это лучший способ сравнения двух объектов в Java.

Позволяя вашему классу Country реализовать Comparator<Country>, вы можете создать новый пользовательский метод сравнения в своем классе. Интерфейс Comparator содержит абстрактный метод compare(T o1, T o2), который будет унаследован в вашем классе Country.

class Country implements Comparator<Country>
{
    private String name;
    private int area;

    public Country(String name, int area) 
    {
        this.name = name;
        this.area = area;

    }

    public int compare(Country c1, Country c2) { //inherited from Comparator interface
        if(c1.area > c2.area) { //returns -1 if c1.area > c2.area
            return -1;
        } else {
            return 1; //returns 1 if c1.area < c2.area or c1.area == c2.area
        }
    }
}

Причина, по которой реализация компаратора для вашего объекта превосходит все, заключается в том, что теперь вы можете использовать Arrays.sort метод для сортировки массива, содержащего Country объекты, согласно пользовательскому методу сравнения в классе Country.

При использовании Arrays.sort(countries), содержащем {("Uruguay", 176220), ("Thailand", 514000), "Belgium", 30510}, будет отсортирован массив по {("Thailand", 514000),("Uruguay", 176220),("Belgium", 30510)}.

Обратите внимание, что ваш массив содержит объекты Country, содержащие указанную выше информацию, и фактически не содержит кортежей (записал это так, чтобы сделать его более наглядным).

Теперь вы можете просто получить объект страны с максимальной площадью на Country max = countries[0];.

Внедрив Comparator, вы избегаете многозначности кода в l oop (это может иметь большое значение, если вам нужно сравнивать ваш объект в разных местах в вашей программе).

Теперь ваш максимальный метод содержит только две строки кода.

public static Country maximum(Country[] countries) {
        Arrays.sort(countries);
        return countries[0];
    }
0 голосов
/ 10 марта 2020

Создайте объект Measurable (max), который содержит минимальное возможное значение для области.

Сравните область max с каждым объектом (obj) из objects.

Если площадь объекта (obj) больше, заменить max;

Возврат max

public static Measurable maximum(Measurable[] objects) {

    if (objects == null || objects.length == 0){

        return new Country("", 0);

    }

    Measurable max = new Country("", 0);

    for (Measurable obj : objects){

        if(obj.getMeasure() > max.getMeasure()){

            max = obj;

        }

    }

    return max;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...