Stati c методы в интерфейсе - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь добавить методы stati c, наибольшие и наименьшие, в измеряемый интерфейс. Методы должны возвращать объект с наибольшей или наименьшей мерой (double) из массива объектов измеряемой страны. Я попытался сделать это в интерфейсе, но кто-то рекомендовал мне использовать интерфейс Comparator. Как это можно сделать, используя вместо этого Измеримый интерфейс?

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 = Measurable.largest(countries);
        Measurable smallest = Measurable.smallest(countries);
    }
}


class Country implements Measurable {
    private String name;
    private double area;


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

interface Measurable {
    static Measurable largest(Measurable[] countries) {

        public static Measurable largest(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;

        }
    }


    static Measurable smallest(Measurable[] objects) {
        if (objects == null || objects.length == 0) {

            return new Country("", 0);

        }

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

        for (Measurable obj : objects) {

            if (obj.getMeasure() < min.getMeasure()) {

                min = obj;

            }

        }

        return min;

    }

}

    double getMeasure();
}

1 Ответ

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

Вам не нужно создавать Измеримый интерфейс, если вы хотите использовать Comparator / Comparable.

Просто внедрите Comparable в Country, а затем l oop через массив, чтобы найти минимальное и максимальное значения.

class Main {
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 max = null;
    Country min = null;
    for (Country c : countries) {
        if (max == null || max.compareTo(c) < 0) {
            max = c;
        }
        if (min == null || min.compareTo(c) > 0) {
            min = c;
        }
    }

    System.out.printf("max: %s (%s)%n", max.name, max.area);
    System.out.printf("min: %s (%s)%n", min.name, min.area);
}
}


class Country implements Comparable<Country> {
String name;
double area;

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

@Override
public int compareTo(Country other) {
    // Returns int <0 if this is smaller than other
    // 0 if they are equal
    // int >0 if this is greater than other
    return Double.compare(this.area, other.area);
}
}

Если вы помещаете свои страны в коллекцию, вы можете использовать функции Collections.min() и Collections.max() вместе с интерфейсом Comparable. Ваш основной метод будет выглядеть следующим образом:

public static void main(String args[]) {
    List<Country> countries = new ArrayList<>();
    countries.add(new Country("Uruguay", 176220));
    countries.add(new Country("Thailand", 514000));
    countries.add(new Country("Belgium", 30510));

    Country max = Collections.max(countries);
    Country min = Collections.min(countries);

    System.out.printf("max: %s (%s)%n", max.name, max.area);
    System.out.printf("min: %s (%s)%n", min.name, min.area);
}

Если вы все еще хотите использовать измеримый интерфейс, вы можете расширить ArrayList и сделать так, чтобы этот класс реализовал его следующим образом:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Main {
    public static void main(String args[]) {
        CountryList countries = new CountryList();
        countries.add(new Country("Uruguay", 176220));
        countries.add(new Country("Thailand", 514000));
        countries.add(new Country("Belgium", 30510));

        Country max = countries.getLargest();
        Country min = countries.getSmallest();

        System.out.printf("max: %s (%s)%n", max.name, max.area);
        System.out.printf("min: %s (%s)%n", min.name, min.area);
    }
}

class CountryList extends ArrayList<Country> implements Measurable{
    @Override
    public Country getSmallest() {
        return Collections.min(this);
    }
    @Override
    public Country getLargest() {
        return Collections.max(this);
    }
}

interface Measurable{
    Country getSmallest();
    Country getLargest();
}

class Country implements Comparable<Country> {
    String name;
    double area;

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

    @Override
    public int compareTo(Country o) {
        return Double.compare(this.area, o.area);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...