[java] Java에서 C ++ Pair <L, R>에 해당하는 것은 무엇입니까?

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)