Java对<T,N>类的实现
是否有可用的Java Pair类实现?
我的意思是随时可用,被广泛接受和testing,可能是更广泛的图书馆的一部分,如Apache Commons或Guava。
是的,看看Apache Commons Pair
。
谨慎使用, 如果有的话 ; left
并没有真正传达任何有关元素之间的内容或关系。
( Pair
类故意不在标准的Java API中。)
Map.Entry
那么java.util.Map.Entry
接口呢?
与Java 6及更高版本捆绑在一起的两个具体实现:
-
java.util.AbstractMap.SimpleEntry
-
java.util.AbstractMap.SimpleImmutableEntry
当需要存储对(如大小和对象集合)时,我使用AbstractMap.SimpleEntry和AbstractMap.SimpleImmutableEntry 。
这个从我的生产代码:
public Map<L1Risk, Map.Entry<int[], Map<L2Risk, Map.Entry<int[], Map<L3Risk, List<Event>>>>>> getEventTable(RiskClassifier classifier) { Map<L1Risk, Map.Entry<int[], Map<L2Risk, Map.Entry<int[], Map<L3Risk, List<Event>>>>>> l1s = new HashMap<>(); Map<L2Risk, Map.Entry<int[], Map<L3Risk, List<Event>>>> l2s = new HashMap<>(); Map<L3Risk, List<Event>> l3s = new HashMap<>(); List<Event> events = new ArrayList<>(); ... map.put(l3s, events); map.put(l2s, new AbstractMap.SimpleImmutableEntry<>(l3Size, l3s)); map.put(l1s, new AbstractMap.SimpleImmutableEntry<>(l2Size, l2s)); }
代码看起来很复杂,但不是Map.Entry ,而只限于对象数组(大小为2),并且会丢失types检查…
以下是Android SDK的一个实现:
/** * Container to ease passing around a tuple of two objects. This object provides a sensible * implementation of equals(), returning true if equals() is true on each of the contained * objects. */ public class Pair<F, S> { public final F first; public final S second; /** * Constructor for a Pair. * * @param first the first object in the Pair * @param second the second object in the pair */ public Pair(F first, S second) { this.first = first; this.second = second; } /** * Checks the two objects for equality by delegating to their respective * {@link Object#equals(Object)} methods. * * @param o the {@link Pair} to which this one is to be checked for equality * @return true if the underlying objects of the Pair are both considered * equal */ @Override public boolean equals(Object o) { if (!(o instanceof Pair)) { return false; } Pair<?, ?> p = (Pair<?, ?>) o; return Objects.equal(p.first, first) && Objects.equal(p.second, second); } /** * Compute a hash code using the hash codes of the underlying objects * * @return a hashcode of the Pair */ @Override public int hashCode() { return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode()); } /** * Convenience method for creating an appropriately typed pair. * @param a the first object in the Pair * @param b the second object in the pair * @return a Pair that is templatized with the types of a and b */ public static <A, B> Pair <A, B> create(A a, B b) { return new Pair<A, B>(a, b); } }
JavaFX将其作为javafx.util.Pair
。
http://docs.oracle.com/javafx/2/api/javafx/util/Pair.html
如果您在Java SDK中包含jfxrt.jar,则可以使用它。
我的解决scheme是:
public class Pair<F, S> extends java.util.AbstractMap.SimpleImmutableEntry<F, S> { public Pair( F f, S s ) { super( f, s ); } public F getFirst() { return getKey(); } public S getSecond() { return getValue(); } public String toString() { return "["+getKey()+","+getValue()+"]"; } }
很简单,具有包装AbstractMap.SimpleImmutableEntry类的所有优点。