Вопрос-ответ

What is the equivalent of the C++ Pair in Java?

Что эквивалентно паре C ++ в Java?

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

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

Переведено автоматически
Ответ 1

В потоке на comp.lang.java.help Хантер Гратцнер приводит несколько аргументов против наличия Pair конструкции в Java. Основной аргумент заключается в том, что класс Pair не передает никакой семантики о взаимосвязи между двумя значениями (откуда вы знаете, что означают "первое" и "второе"?).

Лучшая практика - написать очень простой класс, подобный тому, который предложил Майк, для каждого приложения, которое вы бы создали из Pair класса. Map.Entry это пример пары, значение которой отражено в ее названии.

Подводя итог, на мой взгляд, лучше иметь class Position(x,y), a class Range(begin,end) и a class Entry(key,value), а не generic Pair(first,second), который ничего не говорит мне о том, что он должен делать.

Ответ 2

Это Java. Вы должны создать свой собственный класс Pair с описательными именами классов и полей, и не обращать внимания на то, что вам придется изобретать велосипед, снова и снова создавая hashCode() / equals() или реализуя Comparable.

Ответ 3

Класс пары , совместимый с HashMap:

public class Pair<A, B> {
private A first;
private B second;

public Pair(A first, B second) {
super();
this.first = first;
this.second = second;
}

public int hashCode() {
int hashFirst = first != null ? first.hashCode() : 0;
int hashSecond = second != null ? second.hashCode() : 0;

return (hashFirst + hashSecond) * hashSecond + hashFirst;
}

public boolean equals(Object other) {
if (other instanceof Pair) {
Pair otherPair = (Pair) other;
return
(( this.first == otherPair.first ||
( this.first != null && otherPair.first != null &&
this.first.equals(otherPair.first))) &&
( this.second == otherPair.second ||
( this.second != null && otherPair.second != null &&
this.second.equals(otherPair.second))) );
}

return false;
}

public String toString()
{
return "(" + first + ", " + second + ")";
}

public A getFirst() {
return first;
}

public void setFirst(A first) {
this.first = first;
}

public B getSecond() {
return second;
}

public void setSecond(B second) {
this.second = second;
}
}
Ответ 4

Самая короткая пара, которую я смог придумать, следующая, используя Ломбок:

@Data
@AllArgsConstructor(staticName = "of")
public class Pair<F, S> {
private F first;
private S second;
}

Он обладает всеми преимуществами ответа от @arturh (кроме сопоставимости), у него есть hashCode, equals, toString и статический ”конструктор".

java