Как можно сравнить 2 элемента каждой пары в Arraylist (Java)

#java #interface

#java #интерфейс

Вопрос:

У меня есть пара интерфейсов

 import java.util.ArrayList;

public interface Pair<T,M> {
    public T getFirst();
    public M getSecond();
    public ArrayList<Pair<T,M>> Compare(ArrayList<Pair<T,M>> list);
}
  

и класс MatchingPairs, который реализует интерфейс Pair:

 import java.util.ArrayList;

public class MatchingPairs implements Pair<Integer, Integer> {

    @Override
    public Integer getFirst() {
        return null;
    }

    @Override
    public Integer getSecond() {
        return null;
    }

    @Override
    public ArrayList<Pair<Integer, Integer>> Compare(ArrayList<Pair<Integer, Integer>> list) {
        return null;
    }
}
  

Я не знаю, как сравнить первый элемент и второй элемент каждой пары, реализовав метод сравнения.

Комментарии:

1. Почему класс элемента MatchingPairs (хотя имя кажется странным) содержит метод для сравнения их списков? И в чем проблема с получением элементов с одинаковым индексом, получением первого и второго для обоих элементов и их сравнением?

2. Ваш метод Compare() кажется мне действительно странным. Пожалуйста, предоставьте некоторые примерные данные и результат метода. Объясните, что он должен производить. Обычно я ожидаю, что a Pair реализует Comparable интерфейс, то есть имеет compareTo метод, в котором вы сравниваете этот экземпляр Pair с другим Pair , и это возвращает логическое значение.

Ответ №1:

Я не уверен, чего вы пытаетесь достичь с помощью метода сравнения. Но вот пример сравнения двух списков совпадающих пар с использованием сопоставимого интерфейса.

 import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;

public class Main {

    public interface Pair<T,M> extends Comparable<Pair<T,M>> {
        T getFirst();
        M getSecond();
    }

    public static class MatchingPairs implements Pair<Integer, Integer> {

        private final Integer first;
        private final Integer second;

        public MatchingPairs(int first, int second) {
            this.first = first;
            this.second = second;
        }

        @Override
        public Integer getFirst() {
            return first;
        }

        @Override
        public Integer getSecond() {
            return second;
        }

        /**
         * Returns 0 if both first and second are equal in this and the other object
         * Returns 1 if both first and second are greater in this object ('this' is greater than 'other')
         * Otherwise return -1 ('this' is less than 'other')
         */
        @Override
        public int compareTo(@NotNull Pair<Integer, Integer> other) {
            int cf = this.getFirst().compareTo(other.getFirst());
            int cs = this.getSecond().compareTo(other.getSecond());
            if (cf == 0 amp;amp; cs == 0) {
                return 0;
            } else if (cf > 0 amp;amp; cs > 0) {
                return 1;
            }
            return -1;
        }

        @Override
        public String toString() {
            return "MatchingPairs{first="   first   ", second="   second   '}';
        }
    }

    public static void main(String[] args) {
        List<MatchingPairs> pairs = List.of(new MatchingPairs(2,3), new MatchingPairs(1,2), new MatchingPairs(1,1));
        MatchingPairs find = new MatchingPairs(1, 2);
        // collect all pairs that are greater than 'find'
        List<MatchingPairs> matching = pairs.stream()
                .filter(mp -> mp.compareTo(find) > 0)
                .collect(Collectors.toList());
        System.out.println(matching);
    }

}
  

Точная реализация метода compareTo может отличаться для вас, поскольку вы не указали точное поведение, которое пытаетесь реализовать.
В основном методе мы создаем список пар совпадений, а затем собираем все пары совпадений из этого списка, которые больше указанного экземпляра MatchingPairs .