pair java что это
Кортежи объектов в Java и их коллекции
Достаточно часто на практике возникает необходимость воспользоваться такими конструкциями как «пара» ( Pair ), менее часто «тринарными» объектами ( Triplet ) и более длинными цепочками ассоциированных объектов. В связи с чем всегда удивлялся, почему в JDK (в java.lang.* или java.util.* ) до настоящего момента нет стандартной Pair или более длинных конструкций. Думаю многие программисты практикующие на Java имеют свою реализацию «пары». Не исключением являюсь и я.
И вот в очередной раз наткнувшись на необходимость работать с большим количеством различных кортежей, решил взяться за эту проблему системно. Придумал название проекту, определил цели и после экспериментов, занявших некоторое время, выложил код ( git://github.com/telesik/rumba.git ).
Явление на свет кортежа
И вот на свет появился интерфейс Cortege :
На рисунке ниже наглядно показан механизм описания кортежей произвольной длины и типов элементов
Рис. 1. механизм описания кортежей произвольной длины и типов элементов
Примеры использования
Перейду сразу к наглядным примерам использования:
Следует обратить внимание на аргумент метода create. В связи с тем, что в Java дженерики существуют лишь на этапе компиляции, и добраться к ним в runtime я «законных» методов не нашел :(, пришлось «заплатить» за это такой ценой. Суть этого параметра — декларация глубины создаваемого кортежа. Но в виду того, что разработчик как правило знает кол-во элементов, необходимость указания этого параметра не должно вызывать больших проблем.
примечание: Но все же, если кто-то может предложить свое решение это проблемки с параметром — я буду чрезвычайно благодарен.
Что еще можно сделать с кортежем:
1. Получить кортеж “справа”.
2. Получить “глубину” (кол-во элементов в кортеже)
Пожалуй все. Но не все! 🙂
Коллекции кортежей
И вот что получилось:
Рис. 2. Топология кортежных коллекций
Примеры использования коллекций кортежей
Теперь наверное стоит как и в случае с описанием Cortege сразу перейти к наглядным примерам использования:
Подведем итоги
Заключение
Работая над библиотекой я старался покрыть наиболее типичные, и с моей точки зрения, полезные задачи, возникающие при работе с кортежами и их коллекциями. К сожалению не все планы реализовано, но надеюсь та толика работы, что была выполнена будет кому-нибудь полезна. Но работа продолжается, надеюсь не зря.
Было бы очень интересно получить конструктивный фитбэк на эту статью и библиотеку.
Что такое парный класс в Java?
Класс Java Pair хранит два значения в виде кортежа. Это может быть полезно для получения функции, возвращающей два значения. Java имеет встроенный класс Pair из
Класс Java Pair хранит два значения в виде кортежа. Это может быть полезно для получения функции, возвращающей два значения.
Java имеет встроенный класс Pair начиная с Java 8 и далее. Вот почему в этом уроке мы не только рассмотрим встроенный класс pair, но и узнаем, как создать наш собственный класс pair.
Класс Pair очень полезен при использовании древовидной структуры данных. При использовании рекурсии в дереве класс pair позволяет легко передавать значения из одного узла в другой. Эти значения могут быть минимальным и максимальным значением узла до этого узла. Это предотвратило бы повторное посещение определенных узлов снова и снова.
Встроенный класс пар в Java
Встроенный класс Pair является частью пакета JavaFX. Однако этот пакет не является частью стандартной установки OpenJDK. Мы можем добавить его в наш проект, используя следующие зависимости maven.
Давайте сразу перейдем к использованию встроенных парных классов в Java.
Импорт класса пар
Для импорта используйте:
Встроенный класс pair использует обозначения ключа и значения для хранения пары.
Объявление объекта пары
Конструктор принимает значения 7 и “привет” и сохраняет их в классе Pair.
Доступ к значениям
Мы можем получить доступ к значениям из объекта пары с помощью методов getKey() и GetValue ().
Полный код для этого раздела::
Создание собственного класса пар
Создание нашего собственного класса пар-лучшая альтернатива, так как мы можем настроить его в соответствии с нашими собственными предпочтениями. Кроме того, если вы не используете JavaFX в своем проекте, имеет смысл полностью избегать его.
1. Определение пользовательского класса пар
Для простоты мы используем класс pair, в котором хранятся два значения. Целое число и строка. Использование дженериков тоже было бы хорошей идеей.
Две переменные первая и вторая были определены для хранения двух значений типа int и String соответственно.
Конструктор принимает два значения и присваивает их переменным.
2. Парный класс в действии
Чтобы использовать только что созданный класс pair, определите объект класса pair и вызовите конструктор.
Это создает объект пары с 1, хранящимся в первом, и “единицей”, хранящейся во втором.
Для доступа к значениям:
Поскольку класс pair определен нами, мы можем настроить и добавить в него функцию печати.
Код для класса пар:
Включая функцию печати, этот способ является хорошей привычкой к кодированию, так как теперь переменные можно сделать закрытыми. Сохранение открытых переменных небезопасно.
Использование класса сопряжения с функцией
Класс Pair может использоваться для возврата двух значений из функции. Для этого тип возвращаемой функции должен быть pair.
Объект, возвращаемый этой функцией, может быть захвачен в основной функции. Давайте напечатаем объект в главном.
Полный код для этого раздела выглядит следующим образом.
Вывод
Парные классы важны и могут повысить эффективность кода при правильном использовании. Одной из интересных областей использования класса pair является хранение максимальных и минимальных значений поддерева в задачах BST. Это экономит несколько обходов вниз по дереву.
Класс пар в Java
Методы, предоставляемые классом javafx.util.Pair.
Пример:
Выход:
правда ложь
Давайте посмотрим на следующую проблему.
Постановка задачи: Нам дают имена n студентов с соответствующими оценками, полученными в викторине. Нам нужно найти ученика с максимальным баллом в классе.
Примечание. Для запуска приведенной ниже программы на вашем компьютере должна быть установлена Java 8.
/ * Java-программа для поиска пары с максимальным счетом * /
/ * Этот метод возвращает пару с максимальным баллом * /
public static Pair
// Присваиваем минимальное значение изначально
int max = Integer.MIN_VALUE;
// Пара для хранения максимальных оценок
// студент со своим именем
// Используем для каждого цикла итерацию массива
// Получить счет студента
int val = temp.getValue();
// Проверяем, больше ли оно предыдущего
max = val; // обновить максимум
ans = temp; // обновляем пару
// Метод драйвера для проверки вышеуказанного метода
public static void main (String[] args)
int n = 5 ; // Количество студентов
// Создать список массивов
/ * Создать пару имен учеников с их
соответствующий счет и вставить в
// получаем пару с максимальным значением
Pair ans = getMaximum(l);
System.out.println(ans.getKey() + » is top scorer » +
«with score of » + ans.getValue());
Выход :
Примечание : вышеуказанная программа может не работать в онлайн-среде IDE, используйте автономный компилятор.
Java коллекция пар значений? (кортежи?)
Коллекция будет поддерживать свой заданный порядок и не будет обрабатывать одно из значений как уникальный ключ (как на карте).
По сути, я хочу иметь возможность определить массив типа или любые другие 2 типа.
Я понимаю, что могу создать класс только с двумя переменными, но это кажется слишком многословным.
Я также понимаю, что мог бы использовать 2D-массив, но из-за различных типов, которые мне нужно использовать, мне пришлось бы делать их массивами OBJECT, а затем мне приходилось бы приводить все время.
Мне нужно только хранить пары в коллекции, поэтому мне нужно только два значения для каждой записи. Существует ли что-то подобное без прохождения классового маршрута? Спасибо!
Класс Pair является одним из тех обобщающих примеров типа gimme, который достаточно легко написать самостоятельно. Например, от макушки головы:
И да, это существует в нескольких местах в сети, с различной степенью полноты и функциональности. (Мой пример выше должен быть неизменным.)
AbstractMap.SimpleEntry
Спокойно вы ищете это:
Как вы можете заполнить его?
И, с помощью createEntry метода, может еще больше сократить детализацию до:
Поскольку ArrayList он не является окончательным, он может быть разделен на подклассы для предоставления of метода (и вышеупомянутого createEntry метода), что приводит к синтаксическому сжатию:
Java 9+
В Java 9 вы можете просто написать: Map.entry(key, value) создать неизменную пару.
Java 8+
В Java 8 вы можете использовать более универсальные javafx.util.Pair для создания неизменяемой, сериализуемой пары. Этот класс имеет позволяют ключи нулевых значений и нулевые. (В Java 9 этот класс включен в javafx.base модуль). РЕДАКТИРОВАТЬ: Начиная с Java 11, JavaFX был отделен от JDK, поэтому вам потребуется дополнительный артефакт maven org.openjfx: javafx-base.
Java 6+
В Java 6 и выше вы можете использовать более подробный AbstractMap.SimpleImmutableEntry для неизменяемой пары или AbstractMap.SimpleEntry для пары, значение которой можно изменить. Эти классы также допускают нулевые ключи и нулевые значения и являются сериализуемыми.
Android
Если вы пишете для Android, просто используйте Pair.create(key, value) для создания неизменной пары.
Apache Commons
Apache Commons Lang предоставляет полезную Pair.of(key, value) для создания неизменяемой, сопоставимой, сериализуемой пары.
Коллекции Затмения
Если вы используете пары, содержащие примитивы, Eclipse Collections предоставляет несколько очень эффективных классов примитивных пар, которые позволят избежать всех неэффективных автоматических и автоматических распаковок.
Проект Ломбок
В противном случае
Если ни одно из вышеперечисленных решений не поддерживает вашу лодку, вы можете просто скопировать и вставить следующий код (который, в отличие от класса, указанного в принятом ответе, защищает от исключений NullPointerExceptions):
Map.Entry
Эти встроенные классы тоже являются опцией. Оба реализуют Map.Entry интерфейс.
Apache common lang3 имеет класс Pair и несколько других библиотек, упомянутых в этой теме. Что является эквивалентом пары C ++ в Java?
Пример, соответствующий требованию из вашего исходного вопроса:
А как насчет Pair класса «Apache Commons Lang 3» и относительных подклассов?
ImmutablePair является конкретным подклассом, который не позволяет изменять значения в паре, но существуют другие реализации с другой семантикой. Это координаты Maven, если они вам нужны.
Расширяя другие ответы, общая неизменная пара должна иметь статический метод, чтобы избежать загромождения вашего кода при вызове конструктора:
если вы называете статический метод «of» или «pairOf», код становится свободным, поскольку вы можете написать либо:
Я собирался спросить, не хотите ли вы просто использовать List
Для этого вы должны создать класс Pair для использования в вашей коллекции. Это полезный служебный класс для добавления в базу кода.
Ближайшим классом в Sun JDK, обеспечивающим функциональность, аналогичную типичному классу Pair, является AbstractMap.SimpleEntry. Вы можете использовать этот класс, а не создавать свой собственный класс Pair, хотя вам придется жить с некоторыми неловкими ограничениями, и я думаю, что большинство людей нахмурились бы, что это не совсем предназначенная роль SimpleEntry. Например, SimpleEntry не имеет метода setKey () и конструктора по умолчанию, поэтому вы можете счесть его слишком ограничивающим.
Имейте в виду, что коллекции предназначены для элементов одного типа. Связанные служебные интерфейсы, такие как Map, на самом деле не являются коллекциями (т. Е. Map не реализует интерфейс Collection). Пара также не реализует интерфейс Collection, но, очевидно, является полезным классом для построения больших структур данных.
Это основано на коде JavaHelp4u.
Менее многословно и показывает, как сделать в одну строку и как зацикливаться на вещах.
Pair java что это
A pair consisting of two elements.
This class is an abstract implementation defining the basic API. It refers to the elements as ‘left’ and ‘right’. It also implements the Map.Entry interface where the key is ‘left’ and the value is ‘right’.
Subclass implementations may be mutable or immutable. However, there is no restriction on the type of the stored objects that may be stored. If mutable objects are stored in the pair, then the pair itself effectively becomes mutable.
Field Summary
Constructor Summary
Method Summary
Modifier and Type | Method and Description |
---|---|
int | compareTo (Pair other) |
Methods inherited from class java.lang.Object
Methods inherited from interface java.util.Map.Entry
Field Detail
EMPTY_ARRAY
Consider using emptyArray() to avoid generics warnings.
Constructor Detail
Method Detail
emptyArray
Creates an immutable pair of two objects inferring the generic types.
This factory allows the pair to be created using inference to obtain the generic types.
Creates an immutable pair from an existing pair.
This factory allows the pair to be created using inference to obtain the generic types.
compareTo
equals
Compares this pair to another based on the two elements.
getKey
Gets the key from this pair.
This method implements the Map.Entry interface returning the left element as the key.
getLeft
Gets the left element from this pair.
When treated as a key-value pair, this is the key.
getRight
Gets the right element from this pair.
When treated as a key-value pair, this is the value.
getValue
Gets the value from this pair.
This method implements the Map.Entry interface returning the right element as the value.
hashCode
toString
toString
Formats the receiver using the given format.