Java hashmap - 基于两个不同类型对象的键

标签 java hashmap

我想编写一个 Java 类来根据关联的时间戳计算某些规则(对于每个 rueleId)的出现情况。

例如,

输入:

{"ruleId": "1", "timestamp":"Thu Jun 18 16:25:56 PDT 2015"}
{"ruleId": "1", "timestamp":"Thu Jun 18 16:25:56 PDT 2015"}
{"ruleId": "2", "timestamp":"Thu Jun 18 16:25:56 PDT 2015"}
{"ruleId": "2", "timestamp":"Thu Jun 18 16:25:56 PDT 2015"}
{"ruleId": "2", "timestamp":"Thu Jun 18 16:27:56 PDT 2015"}

输出:

timestamp: "Thu Jun 18 16:25:56 PDT 2015", ruleId: "1", count: 2
timestamp: "Thu Jun 18 16:25:56 PDT 2015", ruleId: "2", count: 2
timestamp: "Thu Jun 18 16:27:56 PDT 2015", ruleId: "2", count: 1

我想我可以使用 HashMap。

我认为这里的键是基于 ruleId(type : String) 和 timestamp(type : Calendar) 的,值为计数。

我怎样才能拥有基于两个不同对象的 key ? 我的方法错了吗?

最佳答案

您必须创建一个复合键:

public final class CompositeKey {
    private final String ruleType;
    private final Calendar timeStamp;

    public CompositeKey(String ruleType, Calendar timeStamp) {
        this.ruleType = Objects.requireNonNull(ruleType);
        this.timeStamp = (Calendar) Objects.requireNonNull(timeStamp).clone();
    }

    public String ruleType() { return ruleType; }
    public Calendar timeStamp() { return (Calendar) timeStamp.clone(); }

    @Override public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        CompositeKey other = (CompositeKey) obj;
        return Objects.equals(ruleType, other.ruleType) && Objects.equals(timeStamp, other.timeStamp);
    }

    @Override public int hashCode() { return Objects.hash(ruleType, timeStamp); }
}

当对象用作 HashMap 中的键时,对象不能被修改是很重要的。因此它必须是不可变的。上面的类通过最终类、不提供 setter 和克隆时间戳(因为 Calendar 不是不可变的)来实现该目标。

另一个非常重要的事情是关键类必须提供适当的equalshashCode 方法。

有了这个类,您就可以在 HashMap 中使用它了:

String ruleType = ...
Calendar timeStamp = ...
CompositeKey key = new CompositeKey(ruleType, timeStamp);
Object value = ...

Map<CompositeKey, Object> map = new HashMap<>();
map.put(key, value);

关于Java hashmap - 基于两个不同类型对象的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076705/

相关文章:

基于另一个数组的 Java 打印数组

java - 将随机 UUID 分配为 map 键时出现问题

java - 如何在这个例子中使用 hashmap 中的可变键?

java - 为什么Hashtable的initialCapacity是11,而HashMap中的DEFAULT_INITIAL_CAPACITY是16,需要2的幂?

java - 如何模拟强制转换对象

java - 分发使用 Hibernate 的持久性类

Java 相当于 opencv c++ Mat->data[]

java - 直接在ArrayList中获取输入

Java 8 compute() 和 computeIfPresent() 检查现有值

java - ConcurrentHashMap 内存开销