Перейти к основному содержимому

Использование пар в Java

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

В этом кратком руководстве мы обсудим очень полезную концепцию программирования, известную как Pair . Пары обеспечивают удобный способ обработки простого сопоставления ключа со значением и особенно полезны, когда мы хотим вернуть два значения из метода.

Простая реализация Pair доступна в основных библиотеках Java. Кроме того, некоторые сторонние библиотеки, такие как Apache Commons и Vavr, предоставили эту функциональность в своих соответствующих API.

2. Основная реализация Java

2.1. Парный класс _

Мы можем найти класс Pair в пакете javafx.util . Конструктор этого класса принимает два аргумента: ключ и соответствующее ему значение:

Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();

Этот пример иллюстрирует простое отображение Integer в String с использованием концепции Pair.

Как показано, ключ в объекте пары извлекается с помощью вызова метода getKey() , а значение извлекается с помощью вызова getValue().

2.2. AbstractMap.SimpleEntry и AbstractMap.SimpleImmutableEntry

SimpleEntry определяется как вложенный класс внутри класса AbstractMap . Чтобы создать объект этого типа, мы можем предоставить ключ и значение конструктору:

AbstractMap.SimpleEntry<Integer, String> entry 
= new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();

Доступ к ключу и значению можно получить с помощью стандартных методов получения и установки.

Кроме того, класс AbstractMap также содержит вложенный класс, представляющий неизменяемую пару, класс SimpleImmutableEntry :

AbstractMap.SimpleImmutableEntry<Integer, String> entry
= new AbstractMap.SimpleImmutableEntry<>(1, "one");

Это работает аналогично классу изменяемой пары, за исключением того, что значение пары нельзя изменить. Попытка сделать это приведет к UnsupportedOperationException .

3. Апач Коммонс

В библиотеке Apache Commons мы можем найти класс Pair в пакете org.apache.commons.lang3.tuple . Это абстрактный класс, поэтому его нельзя создать напрямую.

Здесь мы можем найти два подкласса, представляющих неизменяемые и изменяемые пары, Imm utablePair и MutablePair.

Обе реализации имеют доступ к методам получения/установки ключей/значений:

ImmutablePair<Integer, String> pair = new ImmutablePair<>(2, "Two");
Integer key = pair.getKey();
String value = pair.getValue();

Неудивительно, что попытка вызвать setValue() для ImmutablePair приводит к исключению UnsupportedOperationException.

Однако операция полностью действительна для изменяемой реализации:

Pair<Integer, String> pair = new MutablePair<>(3, "Three");
pair.setValue("New Three");

4. Вавр

В библиотеке Vavr парная функциональность обеспечивается неизменяемым классом Tuple2 :

Tuple2<Integer, String> pair = new Tuple2<>(4, "Four");
Integer key = pair._1();
String value = pair._2();

В этой реализации мы не можем изменить объект после создания, поэтому методы мутации возвращают новый экземпляр, который включает предоставленное изменение:

tuplePair = pair.update2("New Four");

5. Альтернатива I — класс простого контейнера

Либо по желанию пользователя, либо при отсутствии какой-либо из вышеупомянутых библиотек стандартным обходным путем для парной функциональности является создание простого класса-контейнера, который упаковывает желаемые возвращаемые значения.

Самым большим преимуществом здесь является возможность указать наше имя, что помогает избежать того, чтобы один и тот же класс представлял разные объекты домена:

public class CustomPair {
private String key;
private String value;

// standard getters and setters
}

6. Альтернатива II — Массивы

Другим распространенным обходным решением является использование простого массива с двумя элементами для достижения аналогичных результатов:

private Object[] getPair() {
// ...
return new Object[] {key, value};
}

Обычно ключ находится в нулевом индексе массива, а соответствующее ему значение — в индексе один.

7. Заключение

В этой статье мы обсудили концепцию пар в Java и различные реализации, доступные в основной Java, а также в других сторонних библиотеках.

Как всегда, код этой статьи доступен на GitHub .