Pair<L,R>
Java 가없는 이유가 있습니까? 이 C ++ 구문과 동등한 것은 무엇입니까? 오히려 내 자신을 다시 구현하는 것을 피하고 싶습니다.
것 같다 1.6 비슷한 (제공 AbstractMap.SimpleEntry<K,V>
)하지만,이 모습이 꽤 뒤얽힌.
답변
년 에 스레드comp.lang.java.help
, 헌터 Gratzner은의 존재에 대한 몇 가지 인수를 제공 Pair
자바 구문을. 주요 주장은 클래스 Pair
가 두 값 사이의 관계에 대한 의미를 전달하지 않는다는 것입니다 ( “first”와 “second”의 의미는 무엇입니까?).
더 좋은 방법은 Mike가 제안한 것과 같이 클래스로 만든 각 응용 프로그램에 대해 매우 간단한 클래스를 작성하는 것 Pair
입니다. Map.Entry
이름에 의미가있는 쌍의 예입니다.
요약하자면, 제 생각에는 수행해야 할 일에 대해 아무것도 알려주지 않는 제네릭보다는 클래스 Position(x,y)
, 클래스 Range(begin,end)
및 클래스 를 갖는 Entry(key,value)
것이 좋습니다 Pair(first,second)
.
답변
이것은 자바입니다. 설명 클래스 및 필드 이름을 사용하여 사용자 정의 된 Pair 클래스를 작성해야하며 hashCode () / equals ()를 작성하거나 Comparable을 반복해서 구현하여 휠을 재발 명 할 것이라는 점을 염두에 두지 마십시오.
답변
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;
}
}
답변
내가 올릴 수있는 가장 짧은 쌍은 롬복을 사용하여 다음과 같습니다 .
@Data
@AllArgsConstructor(staticName = "of")
public class Pair<F, S> {
private F first;
private S second;
}
@arturh (비교 제외) 의 대답 의 모든 이점을 가지고 hashCode
있으며 equals
, toString
및 정적 “생성자”가 있습니다.
답변
아파치 코 몬즈 랭 3.0 이상 몇 쌍의 클래스가 :
http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/package-summary.html
답변
Pair with를 구현하는 또 다른 방법입니다.
- 공개 불변 필드, 즉 간단한 데이터 구조.
- 유사한.
- 간단한 해시와 같습니다.
-
간단한 팩토리이므로 유형을 제공 할 필요가 없습니다. 예를 들어 Pair.of ( “hello”, 1);
public class Pair<FIRST, SECOND> implements Comparable<Pair<FIRST, SECOND>> { public final FIRST first; public final SECOND second; private Pair(FIRST first, SECOND second) { this.first = first; this.second = second; } public static <FIRST, SECOND> Pair<FIRST, SECOND> of(FIRST first, SECOND second) { return new Pair<FIRST, SECOND>(first, second); } @Override public int compareTo(Pair<FIRST, SECOND> o) { int cmp = compare(first, o.first); return cmp == 0 ? compare(second, o.second) : cmp; } // todo move this to a helper class. private static int compare(Object o1, Object o2) { return o1 == null ? o2 == null ? 0 : -1 : o2 == null ? +1 : ((Comparable) o1).compareTo(o2); } @Override public int hashCode() { return 31 * hashcode(first) + hashcode(second); } // todo move this to a helper class. private static int hashcode(Object o) { return o == null ? 0 : o.hashCode(); } @Override public boolean equals(Object obj) { if (!(obj instanceof Pair)) return false; if (this == obj) return true; return equal(first, ((Pair) obj).first) && equal(second, ((Pair) obj).second); } // todo move this to a helper class. private boolean equal(Object o1, Object o2) { return o1 == null ? o2 == null : (o1 == o2 || o1.equals(o2)); } @Override public String toString() { return "(" + first + ", " + second + ')'; } }
답변
http://www.javatuples.org/index.html 은 어떻습니까? 매우 유용하다는 것을 알았습니다.
javatuples는 1에서 10 개의 요소로 구성된 튜플 클래스를 제공합니다.
Unit<A> (1 element)
Pair<A,B> (2 elements)
Triplet<A,B,C> (3 elements)
Quartet<A,B,C,D> (4 elements)
Quintet<A,B,C,D,E> (5 elements)
Sextet<A,B,C,D,E,F> (6 elements)
Septet<A,B,C,D,E,F,G> (7 elements)
Octet<A,B,C,D,E,F,G,H> (8 elements)
Ennead<A,B,C,D,E,F,G,H,I> (9 elements)
Decade<A,B,C,D,E,F,G,H,I,J> (10 elements)