Что эквивалентно паре C ++ <L, R> в Java? - PullRequest
638 голосов
/ 01 октября 2008

Есть ли веская причина, почему в Java нет Pair<L,R>? Что будет эквивалентно этой конструкции C ++? Я бы предпочел не реализовывать свою собственную.

Кажется, что 1.6 обеспечивает нечто подобное (AbstractMap.SimpleEntry<K,V>), но это выглядит довольно запутанным.

Ответы [ 33 ]

0 голосов
/ 09 декабря 2011
public class Pair<K, V> {

    private final K element0;
    private final V element1;

    public static <K, V> Pair<K, V> createPair(K key, V value) {
        return new Pair<K, V>(key, value);
    }

    public Pair(K element0, V element1) {
        this.element0 = element0;
        this.element1 = element1;
    }

    public K getElement0() {
        return element0;
    }

    public V getElement1() {
        return element1;
    }

}

использование:

Pair<Integer, String> pair = Pair.createPair(1, "test");
pair.getElement0();
pair.getElement1();

Неизменный, только пара!

0 голосов
/ 28 декабря 2012

Многие публикуют код Pair, который можно использовать в качестве ключа на карте ... Если вы пытаетесь использовать пару в качестве ключа хеширования (распространенная идиома), обязательно посмотрите * 1002 в Guava. *: http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Table. Они дают следующий пример использования для ребер графа:

Table<Vertex, Vertex, Double> weightedGraph = HashBasedTable.create();
weightedGraph.put(v1, v2, 4);
weightedGraph.put(v1, v3, 20);
weightedGraph.put(v2, v3, 5);

weightedGraph.row(v1); // returns a Map mapping v2 to 4, v3 to 20
weightedGraph.column(v3); // returns a Map mapping v1 to 20, v2 to 5

A Table сопоставляет два ключа одному значению и обеспечивает эффективный поиск только для обоих типов ключей. Я начал использовать эту структуру данных вместо Map<Pair<K1,K2>, V> во многих частях моего кода. Существуют массивы, деревья и другие реализации как для плотного, так и для разрозненного использования, с возможностью указания собственных промежуточных классов карты.

0 голосов
/ 27 января 2016

С новой версией Lombok вы можете скомпилировать этот симпатичный класс:

@Value(staticConstructor = "of") public class Pair <E> {
  E first, second;
}

и используйте его как: Pair<Value> pairOfValues = Pair.of(value1, value2);

...