协慌网

登录 贡献 社区

Java 中的 C ++ Pair <L,R> 等效项是什么?

有充分的理由为什么 Java 中Pair<L,R>这个 C ++ 构造相当于什么?我宁愿避免重新实现自己的。

似乎1.6提供了类似的东西( AbstractMap.SimpleEntry<K,V> ),但是这看起来很复杂。

答案

comp.lang.java.help上的一个线程中,Hunter Gratzner 提供了一些反对 Java 中Pair主要论点是,类Pair不传达关于两个值之间关系的任何语义(您如何知道 “第一” 和 “第二” 的含义?)。

Pair类的每个应用程序编写一个非常简单的类,如 Mike 提出的那样。 Map.Entry是在名称中带有其含义的一对示例。

综上所述,我认为最好有一个Position(x,y)类, Range(begin,end)类和Entry(key,value)类,而不是通用的Pair(first,second)不要告诉我有关它应该做什么的任何事情。

这是 Java。您必须使用描述性的类和字段名称来制作自己的量身定制的 Pair 类,并且不要介意通过编写 hashCode()/ equals()或一次又一次地实现 Comparable 来重新发明轮子。

HashMap 兼容的 Pair 类:

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;
    }
}