Мне нравится, как в Java есть карта, где вы можете, например, определить типы каждой записи на карте <String, Integer>
.
То, что я ищу, - это тип коллекции, где каждый элемент коллекции представляет собой пару значений. Каждое значение в паре может иметь свой собственный тип (например, пример String и Integer выше), который определяется во время объявления.
Коллекция будет поддерживать свой заданный порядок и не будет обрабатывать одно из значений как уникальный ключ (как на карте).
По сути, я хочу иметь возможность определить массив типа <String,Integer>
или любые другие 2 типа.
Я понимаю, что могу создать класс только с двумя переменными, но это кажется слишком многословным.
Я также понимаю, что мог бы использовать 2D-массив, но из-за различных типов, которые мне нужно использовать, мне пришлось бы делать их массивами OBJECT, а затем мне приходилось бы приводить все время.
Мне нужно только хранить пары в коллекции, поэтому мне нужно только два значения для каждой записи. Существует ли что-то подобное без прохождения классового маршрута? Спасибо!
Pair
, и люди в Google зашли так далеко, что создали гораздо лучшую альтернативу - Auto / Value . Это позволяет легко создавать хорошо типизированные классы типов значений с правильной семантикой equals / hashCode. Вам никогда не понадобитсяPair
тип снова!Ответы:
Класс Pair является одним из тех обобщающих примеров типа gimme, который достаточно легко написать самостоятельно. Например, от макушки головы:
И да, это существует в нескольких местах в сети, с различной степенью полноты и функциональности. (Мой пример выше должен быть неизменным.)
источник
long l = left.hashCode() * 2654435761L;
return (int)l + (int)(l >>> 32) + right.hashCode();
AbstractMap.SimpleEntry
Спокойно вы ищете это:
Как вы можете заполнить его?
Это упрощает:
И, с помощью
createEntry
метода, может еще больше сократить детализацию до:Поскольку
ArrayList
он не является окончательным, он может быть разделен на подклассы для предоставленияof
метода (и вышеупомянутогоcreateEntry
метода), что приводит к синтаксическому сжатию:источник
SimpleEntry
естьsetValue
метод исключения класса родного брата, который должен быть неизменным. Таким образом, имяSimpleImmutableEntry
.Entry
подразумевается, что это пара ключ-значение, и это хорошо для этого. Но у него есть слабые места как настоящий кортеж. Например,hashcode
реализацияSimpleEntry
просто записывает коды элементов, поэтому<a,b>
хэширует то же значение, что и<b,a>
. Реализации кортежей часто сортируются лексикографически, ноSimpleEntry
не реализуютсяComparable
. Так что будьте осторожны там ...Java 9+
В Java 9 вы можете просто написать:
Map.entry(key, value)
создать неизменную пару.Примечание: этот метод не позволяет ключам или значениям быть нулевыми. Если вы хотите , чтобы значения NULL, например, вы хотите изменить это:
Map.entry(key, Optional.ofNullable(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 предоставляет несколько очень эффективных классов примитивных пар, которые позволят избежать всех неэффективных автоматических и автоматических распаковок.
Например, вы могли бы использовать ,
PrimitiveTuples.pair(int, int)
чтобы создатьIntIntPair
илиPrimitiveTuples.pair(float, long)
создатьFloatLongPair
.Проект Ломбок
Используя Project Lombok , вы можете создать неизменный класс пары просто написав:
Ломбок заполнит конструктора, добытчик,
equals()
,hashCode()
иtoString()
методы для вас автоматически сгенерированных байт - коды. Если вы хотите статический метод фабрики вместо конструктора, например,Pair.of(k, v)
просто изменить аннотацию:@Value(staticConstructor = "of")
.В противном случае
Если ни одно из вышеперечисленных решений не поддерживает вашу лодку, вы можете просто скопировать и вставить следующий код (который, в отличие от класса, указанного в принятом ответе, защищает от исключений NullPointerExceptions):
источник
Pair
интерфейс для объектов, который может быть создан с помощью вызоваTuples.pair(object1, object2)
. eclipse.org/collections/javadoc/9.2.0/org/eclipse/collections/…List<Pair<Integer, String> listOfTuple
. Как я могу использоватьlistOfTuple.add()
? Если я сделаю -listOfTuple.add(Pair<someInteger, someString>);
это не сработает. Заранее спасибо.Map.Entry
Эти встроенные классы тоже являются опцией. Оба реализуют
Map.Entry
интерфейс.AbstractMap.SimpleEntry
AbstractMap.SimpleImmutableEntry
источник
Apache common lang3 имеет класс Pair и несколько других библиотек, упомянутых в этой теме. Что является эквивалентом пары C ++ <L, R> в Java?
Пример, соответствующий требованию из вашего исходного вопроса:
источник
Любой, кто разрабатывает для Android, может использовать android.util.Pair . :)
источник
А как насчет
Pair
класса «Apache Commons Lang 3» и относительных подклассов?ImmutablePair
является конкретным подклассом, который не позволяет изменять значения в паре, но существуют другие реализации с другой семантикой. Это координаты Maven, если они вам нужны.источник
Вы можете написать общий класс Pair <A, B> и использовать его в массиве или списке. Да, вы должны написать класс, но вы можете использовать один и тот же класс для всех типов, так что вам нужно сделать это только один раз.
источник
Расширяя другие ответы, общая неизменная пара должна иметь статический метод, чтобы избежать загромождения вашего кода при вызове конструктора:
если вы называете статический метод "of" или "pairOf", код становится свободным, поскольку вы можете написать либо:
очень жаль, что базовые библиотеки java настолько редки, что вам приходится использовать commons-lang или другие третьи стороны для выполнения таких базовых задач. Еще одна причина, чтобы перейти на Скала ...
источник
Я собирался спросить, не хотите ли вы просто использовать
List<Pair<T, U>>
? но тогда, конечно, JDK не имеет класса Pair <>. Но быстрый Google нашел его как в Википедии , так и на forums.sun.com . ураисточник
Как вы уже описали, предпочтительное решение - это список пар (т. Е. Список).
Для этого вы должны создать класс Pair для использования в вашей коллекции. Это полезный служебный класс для добавления в базу кода.
Ближайшим классом в Sun JDK, обеспечивающим функциональность, аналогичную типичному классу Pair, является AbstractMap.SimpleEntry. Вы можете использовать этот класс, а не создавать свой собственный класс Pair, хотя вам придется жить с некоторыми неловкими ограничениями, и я думаю, что большинство людей нахмурились бы, что это не совсем предназначенная роль SimpleEntry. Например, SimpleEntry не имеет метода setKey () и конструктора по умолчанию, поэтому вы можете счесть его слишком ограничивающим.
Имейте в виду, что коллекции предназначены для элементов одного типа. Связанные служебные интерфейсы, такие как Map, на самом деле не являются коллекциями (т. Е. Map не реализует интерфейс Collection). Пара также не реализует интерфейс Collection, но, очевидно, является полезным классом для построения больших структур данных.
источник
Это основано на коде JavaHelp4u.
Менее многословно и показывает, как сделать в одну строку и как зацикливаться на вещах.
источник
Apache Crunch также имеет
Pair
класс: http://crunch.apache.org/apidocs/0.5.0/org/apache/crunch/Pair.htmlисточник
просто создайте класс как
затем создайте список этих объектов кортежей
так что вы также можете реализовать другие новые структуры данных таким же образом.
источник
Я имею в виду, что хотя
Pair
в Java нет классов, есть что-то довольно похожее:Map.Entry
Map.Entry Документация
Это (немного упрощает) что
HashMap
, или на самом деле любойMap
магазины.Вы можете создать экземпляр для
Map
хранения ваших значений в нем и получить набор записей. Вы закончите сSet<Map.Entry<K,V>>
то, что вам нужно.Так:
источник
Spring имеет
Pair<S,T>
тип в пакете Data Utilsorg.springframework.data.util
источник
А как насчет com.sun.tools.javac.util.Pair?
источник
Первое, о чем я думаю, когда говорю о парах ключ / значение, это класс свойств, в котором вы можете сохранять и загружать элементы в поток / файл.
источник
В проекте Reactor (io.projectreactor: реактор-актив) имеется расширенная поддержка n-Tuples:
Там вы можете получить,
t.getT1(), t.getT2(), ...
особенно с Stream или Flux, вы даже можете отобразить элементы кортежа:источник