Java коллекция пар значений? (кортежи?) - PullRequest
303 голосов
/ 06 февраля 2009

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

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

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

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

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

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

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

Ответы [ 18 ]

5 голосов
/ 20 июня 2014

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

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

//======>  Imports
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

//======>  Single Entry
SimpleEntry<String, String> myEntry = new SimpleEntry<String, String>("ID", "Text");
System.out.println("key: " + myEntry.getKey() + "    value:" + myEntry.getValue());
System.out.println();

//======>  List of Entries
List<Entry<String,String>> pairList = new ArrayList<>();

//-- Specify manually
Entry<String,String> firstButton = new SimpleEntry<String, String>("Red ", "Way out");
pairList.add(firstButton);

//-- one liner:
pairList.add(new SimpleEntry<String,String>("Gray", "Alternate route"));  //Ananomous add.

//-- Iterate over Entry array:
for (Entry<String, String> entr : pairList) {
    System.out.println("Button: " + entr.getKey() + "    Label: " + entr.getValue());
}
5 голосов
/ 28 февраля 2013

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

class Pair<L,R> {
      final L left;
      final R right;

      public Pair(L left, R right) {
        this.left = left;
        this.right = right;
      }

      static <L,R> Pair<L,R> of(L left, R right){
          return new Pair<L,R>(left, right);
      }
}

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

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

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

4 голосов
/ 01 ноября 2013

просто создайте класс как

class tuples 
{ 
int x;
int y;
} 

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

List<tuples> list = new ArrayList<tuples>();

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

4 голосов
/ 23 июля 2013

Apache Crunch также имеет класс Pair: http://crunch.apache.org/apidocs/0.5.0/org/apache/crunch/Pair.html

3 голосов
/ 05 сентября 2016

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

Map.Entry Documentation

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

Вы можете создать экземпляр Map, сохранить в нем свои значения и получить набор записей. В итоге вы получите Set<Map.Entry<K,V>>, который фактически является тем, что вы хотите.

Итак:

public static void main(String []args)
{    
    HashMap<String, Integer> values = new HashMap<String,Integer>();
    values.put("A", 235);//your custom data, the types may be different
    //more data insertions....
    Set<Map.Entry<String,Integer>> list = values.entrySet();//your list 
    //do as you may with it
}
0 голосов
/ 27 февраля 2019

В проекте Reactor (io.projectreactor: реактор-актив) имеется расширенная поддержка n-Tuples:

Tuple2<String, Integer> t = Tuples.of("string", 1)

Там вы можете получить t.getT1(), t.getT2(), ... Особенно с Stream или Flux вы даже можете отобразить элементы кортежа:

Stream<Tuple2<String, Integer>> s;
s.map(t -> t.mapT2(i -> i + 2));
0 голосов
/ 14 августа 2018

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

0 голосов
/ 19 июня 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...