映射一个值的两个键



我想创建一个有两个键的映射:

map.put (key1,key2,value1);// Insert into map
map.get(key1,key2); // return value1

我正在研究多键地图,但我不知道我将如何做

听起来你只需要一个从两个值创建的键。您可能会发现,无论如何,这两个值自然应该封装到另一种类型中 - 或者您可以创建一个Key2<K1, K2>类型。(这里的命名将允许Key3Key4等。不过,我不鼓励你走得太远。

对于介于两者之间的内容,您可以在真正需要的类中创建一个私有静态类(如果它只是一个内部实现细节)。如果它不是一个自然封装(例如,它是"名称和人口"之类的东西,在这个特定场景之外没有意义),那么在保留有意义的属性名称方面会很好,但不公开它。

在任何这些情况下,您最终都会得到一个新类型,其中包含两个在构造函数中初始化的最终变量,它们有助于equalshashCode。例如:

public final class Key2<K1, K2> {
    private final K1 part1;
    private final K2 part2;
    public Key2(K1 part1, K2 part2) {
        this.part1 = part1;
        this.part2 = part2;
    }
    @Override public boolean equals(Object other) {
        if (!(other instanceof Key2)) {
            return false;
        }
        // Can't find out the type arguments, unfortunately
        Key2 rawOther = (Key2) other;
        // TODO: Handle nullity
        return part1.equals(rawOther.part1) &&
            part2.equals(rawOther.part2);
    }
    @Override public int hashCode() {
        // TODO: Handle nullity
        int hash = 23;
        hash = hash * 31 + part1.hashCode();
        hash = hash * 31 + part2.hashCode();
        return hash;
    }
    // TODO: Consider overriding toString and providing accessors.
}

更特定于情况的类型会稍微简单一些,因为它们不是泛型的 - 特别是这意味着您无需担心类型参数,并且可以为变量提供更好的名称。

怎么样

class Key{
 private final String key1;
 private final String key2;
//accessors + hashcode + equals()
}

Map<Key, Value> map

你可以考虑使用Guava的Table实现之一。从文档中:

关联有序键对(称为行键)的集合 和具有单个值的列键。表可能是稀疏的,具有 只有一小部分行键/列键对具有 对应的值。

如果您可以使用外部库,Guava Table<R, C, V>提供确切的此功能,将两个键分别称为"行"和"列"。 (披露:我为番石榴做出贡献。

为什么不映射键 a 字符串并连接键 1+键2

如果您总是想通过 key1 和 key2 一起访问,您可以将它们用分隔符连接在一起作为键并使用法线贴图。

不幸的是,Java在语言级别不支持元组,因此您必须选择像此处某些答案中显示的临时结构。这会导致大量的样板和代码重复。

Functional Java具有对元组的库支持。这里符合要求的类是 P2 .该名称的意思是"具有 2 个元素的产品"。(乘积只是复合类型的代数术语。该库最多支持 8 个元素的元组。P{n}类覆盖所有必要的方法

有一个名为 P 的类,它提供了一个静态工厂方法p用于构造元组。

用法:

import fj.P2;
import fj.Ord;
import fj.data.TreeMap;
import static fj.Ord.*;
import static fj.P.*;
TreeMap<P2<Integer, String>, String> m = 
  TreeMap.<P2<Integer, String>, String>empty(p2Ord(intOrd, stringOrd)).
  set(p(1, "2"), "onetwo").
  set(p(5, "3"), "fivethree");

相关内容

  • 没有找到相关文章

最新更新