Java-коллекция пар ценностей? (кортежи?)

Мне нравится, как Java имеет карту, где вы можете определить типы каждой записи на карте, например .

То, что я ищу, – это тип коллекции, в которой каждый элемент коллекции является парой значений. Каждое значение в паре может иметь свой собственный тип (например, пример String и Integer выше), который определяется во время объявления.

Коллекция сохранит свой заданный порядок и не будет рассматривать одно из значений как уникальный ключ (как на карте).

По сути, я хочу иметь возможность определять ARRAY типа или любые другие 2 типа.

Я понимаю, что я могу создать class, в котором есть только две переменные, но это выглядит слишком многословным.

Я также понимаю, что я мог бы использовать 2D-массив, но из-за разных типов, которые мне нужно использовать, я должен был бы сделать их массивами OBJECT, и тогда мне пришлось бы все время бросать.

Мне нужно хранить пары в коллекции, поэтому мне нужно только два значения для каждой записи. Что-то вроде этого существует, не пройдя маршрут classа? Благодаря!

17 Solutions collect form web for “Java-коллекция пар ценностей? (кортежи?)”

Класс Pair является одним из тех примеров gimme generics, которые достаточно легко написать самостоятельно. Например, от головы:

 public class Pair { private final L left; private final R right; public Pair(L left, R right) { this.left = left; this.right = right; } public L getLeft() { return left; } public R getRight() { return right; } @Override public int hashCode() { return left.hashCode() ^ right.hashCode(); } @Override public boolean equals(Object o) { if (!(o instanceof Pair)) return false; Pair pairo = (Pair) o; return this.left.equals(pairo.getLeft()) && this.right.equals(pairo.getRight()); } } 

И да, это существует в нескольких местах в Сети с различной степенью полноты и функциональности. (Мой пример выше должен быть неизменным.)

AbstractMap.SimpleEntry

Легко вы ищете:

 java.util.List> pairList= new java.util.ArrayList<>(); 

Как вы можете его заполнить?

 java.util.Map.Entry pair1=new java.util.AbstractMap.SimpleEntry<>("Not Unique key1",1); java.util.Map.Entry pair2=new java.util.AbstractMap.SimpleEntry<>("Not Unique key2",2); pairList.add(pair1); pairList.add(pair2); 

Это упрощает:

 Entry pair1=new SimpleEntry<>("Not Unique key1",1); Entry pair2=new SimpleEntry<>("Not Unique key2",2); pairList.add(pair1); pairList.add(pair2); 

И, с помощью метода createEntry , можно еще больше уменьшить многословие:

 pairList.add(createEntry("Not Unique key1", 1)); pairList.add(createEntry("Not Unique key2", 2)); 

Поскольку ArrayList не является окончательным, он может быть подclassифицирован, чтобы createEntry метод (и вышеупомянутый метод createEntry ), что приводит к синтаксически кратким:

 TupleList> pair = new TupleList<>(); pair.of("Not Unique key1", 1); pair.of("Not Unique key2", 2); 

Java 9+

В Java 9 вы можете просто написать: Map.entry(key, value) чтобы создать неизменяемую пару.

Примечание. Этот метод не допускает, чтобы ключи или значения были нулевыми. Если вы хотите разрешить нулевые значения, например, вы хотите изменить это на: Map.entry(key, Optional.ofNullable(value)) .


Java 8+

В Java 8 вы можете использовать более универсальный javafx.util.Pair для создания неизменяемой, сериализуемой пары. Этот class разрешает нулевые ключи и нулевые значения. (В Java 9 этот class включен в модуль javafx.base ).


Java 6+

В Java 6 и выше вы можете использовать более подробный AbstractMap.SimpleImmutableEntry для неизменяемой пары или AbstractMap.SimpleEntry для пары, значение которой можно изменить. Эти classы также допускают нулевые ключи и нулевые значения и являются сериализуемыми.


Android

Если вы пишете для Android, просто используйте Pair.create(key, value) чтобы создать неизменяемую пару.


Apache Commons

Apache Commons Lang предоставляет полезную Pair.of(key, value) для создания неизменяемой, сопоставимой, сериализуемой пары.


Коллекции Eclipse

Если вы используете пары, содержащие примитивы, Eclipse Collections предоставляет несколько очень эффективных примитивных парных classов, которые позволят избежать всего неэффективного автоматического бокса и автоматического распаковки.

Например, вы можете использовать PrimitiveTuples.pair(int, int) для создания IntIntPair или PrimitiveTuples.pair(float, long) для создания FloatLongPair .


В противном случае

Если ни одно из вышеперечисленных решений не поплывет к вашей лодке, вы можете просто скопировать и вставить следующий код (который, в отличие от classа, указанного в принятом ответе, защищает от NullPointerExceptions):

 import java.util.Objects; public class Pair { public final K key; public final V value; public Pair(K key, V value) { this.key = key; this.value = value; } public boolean equals(Object o) { return o instanceof Pair && Objects.equals(key, ((Pair< ?,?>)o).key) && Objects.equals(value, ((Pair< ?,?>)o).value); } public int hashCode() { return 31 * Objects.hashCode(key) + Objects.hashCode(value); } public String toString() { return key + "=" + value; } } 

Эти встроенные classы также являются опцией:

  • AbstractMap.SimpleEntry
  • AbstractMap.SimpleImmutableEntry

Apache common lang3 имеет class Pair и несколько других библиотек, упомянутых в этом streamе. Каков эквивалент C ++ Pair в Java?

Пример соответствия требованиям вашего исходного вопроса:

 List> myPairs = new ArrayList>(); myPairs.add(Pair.of("val1", 11)); myPairs.add(Pair.of("val2", 17)); //... for(Pair pair : myPairs) { //following two lines are equivalent... whichever is easier for you... System.out.println(pair.getLeft() + ": " + pair.getRight()); System.out.println(pair.getKey() + ": " + pair.getValue()); } 

Для тех, кто разрабатывает Android, вы можете использовать android.util.Pair . 🙂

Что относительно classа «Apache Commons Lang 3» и относительных подclassов?

  import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; ... @SuppressWarnings("unchecked") Pair[] arr = new ImmutablePair[]{ ImmutablePair.of("A", 1), ImmutablePair.of("B", 2)}; // both access the 'left' part String key = arr[0].getKey(); String left = arr[0].getLeft(); // both access the 'right' part Integer value = arr[0].getValue(); Integer right = arr[0].getRight(); 

ImmutablePair – это отдельный подclass, который не позволяет изменять значения в паре, но есть и другие реализации с другой семантикой. Это координаты Maven, если они вам нужны.

   org.apache.commons commons-lang3 3.4  

Я собирался спросить, не хотите ли вы просто использовать List> ? но тогда, конечно, JDK не имеет classа Pair <>. Но быстрый Google нашел его как в Википедии , так и на forums.sun.com . ура

Предпочтительным решением, которое вы описали, является список пар (т.е. список).

Для этого вы создадите class Pair для использования в своей коллекции. Это полезный class полезности для добавления в базу кода.

Самый близкий class в Sun JDK, обеспечивающий функциональность, похожую на типичный class Pair, – AbstractMap.SimpleEntry. Вы могли бы использовать этот class, а не создавать свой собственный class Pair, хотя вам придется жить с некоторыми неудобными ограничениями, и я думаю, что большинство людей будут на него нахмуриться, так как это не является на самом деле предполагаемой ролью SimpleEntry. Например, SimpleEntry не имеет метода setKey () и конструктора по умолчанию, поэтому вы можете считать его слишком ограниченным.

Имейте в виду, что коллекции предназначены для размещения элементов одного типа. Связанные служебные интерфейсы, такие как Map, фактически не являются коллекциями (т.е. Map не реализует интерфейс Collection). Пара не будет реализовывать интерфейс Collection, но, очевидно, является полезным classом при построении больших структур данных.

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

 class Pair { final L left; final R right; public Pair(L left, R right) { this.left = left; this.right = right; } static  Pair of(L left, R right){ return new Pair(left, right); } } 

если вы назовете статический метод «of» или «pairOf», код станет свободным, так как вы можете написать:

  list.add(Pair.of(x,y)); // my preference list.add(pairOf(x,y)); // use with import static xyPair.pairOf 

его реальный позор, что основные java-библиотеки настолько скудны в таких вещах, что вам нужно использовать commons-lang или другие третьи стороны, чтобы делать такие базовые вещи. еще одна причина для обновления до scala …

Это основано на коде JavaHelp4u.

Менее подробный и показывает, как делать в одной строке и как перебирать вещи.

 //======> Imports import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; //======> Single Entry SimpleEntry myEntry = new SimpleEntry("ID", "Text"); System.out.println("key: " + myEntry.getKey() + " value:" + myEntry.getValue()); System.out.println(); //======> List of Entries List> pairList = new ArrayList<>(); //-- Specify manually Entry firstButton = new SimpleEntry("Red ", "Way out"); pairList.add(firstButton); //-- one liner: pairList.add(new SimpleEntry("Gray", "Alternate route")); //Ananomous add. //-- Iterate over Entry array: for (Entry entr : pairList) { System.out.println("Button: " + entr.getKey() + " Label: " + entr.getValue()); } 

У Apache Crunch также есть class Pair : http://crunch.apache.org/apidocs/0.5.0/org/apache/crunch/Pair.html

просто создайте class вроде

 class tuples { int x; int y; } 

затем создайте Список этих объектов кортежей

 List list = new ArrayList(); 

поэтому вы также можете реализовать другие новые структуры данных таким же образом.

Я имею в виду, хотя в Java нет classа Pair есть что-то довольно симпатичное: Map.Entry

Map.Entry Documentation

Это (немного упрощает) то, что HashMap , или фактически любая Map хранит.

Вы можете создать экземпляр Map хранятся ваши значения, и получить задание. В итоге вы получите Set

>

который вам действительно нужен.

Так:

 public static void main(String []args) { HashMap values = new HashMap(); values.put("A", 235);//your custom data, the types may be different //more data insertions.... Set> list = values.entrySet();//your list //do as you may with it } 

Как насчет com.sun.tools.javac.util.Pair?

Первая мысль, когда я говорю о парах ключ / значение, – это class свойств, в котором вы можете сохранять и загружать элементы в stream / файл.

  • "'Void' type not allowed here" error (Java)
  • Проверка нулевого - в каком порядке?
  • Сортировка коллекций (список , метод сравнения )
  • Как вернуть массив из JNI в Java?
  • Кодировщик и декодер Base64
  • Android: отправка данных> 20 байтов BLE
  • Что такое sharedUserId в Android и как оно используется?
  • Как анализировать XML с помощью анализатора SAX
  • Рабочий многоточечный запрос POST с волейболом и без HttpEntity
  • Как случайным образом выбрать элемент из массива
  • Как использовать устаревший HTTP-клиент Apache на Android Marshmallow?
  • Давайте будем гением компьютера.