我想编写一个 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
不是不可变的)来实现该目标。
另一个非常重要的事情是关键类必须提供适当的equals
和hashCode
方法。
有了这个类,您就可以在 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/