说我有这样的HashMap:
message.put(10, "Message 1");
message.put(20, "Message 2");
message.put(30, "Message 3");
message.put(40, "Message 4");
我会收到一条比较给定ID的消息:
if( message.containsKey(sampleValue) ) {
return message.get(sampleValue);
}
但如果 sampleValue 未包含在消息散列映射中,则无用。是否有通过近似ID值获得它的方法或功能?例如,如果 sampleValue 19 ,则会返回“消息2 ”。我怎样才能做到这一点?
答案 0 :(得分:3)
您可以使用TreeMap
执行任务。它包含ceilingKey
/ floorKey
方法,从右/左返回最近的键。因此,这些方法可用于查找最近的密钥并在O(Log(N))
中检索其对应的值。
class ClosestKeyTreeMap extends TreeMap<Integer, Object> {
public Object getClosestValue(int key) {
Integer leftKey = this.floorKey(key);
Integer rightKey = this.ceilingKey(key);
if (leftKey == null && rightKey == null) {
return null;
} else if (rightKey == null) {
return this.get(leftKey);
} else if (leftKey == null) {
return this.get(rightKey);
}
int leftDiff = key - leftKey;
int rightDiff = rightKey - key;
if (leftDiff < rightDiff) {
return this.get(leftKey);
} else {
return this.get(rightKey);
}
}
}
答案 1 :(得分:2)
我相信您正试图将closest
的值提升为input
。然后我建议先从KeySet
得到最接近的整数。完成后,您只需使用map.get(closet_int)
来检索值。
HashMap<Integer, String> message = new HashMap<>();
message.put(10, "Message 1");
message.put(20, "Message 2");
message.put(30, "Message 3");
message.put(40, "Message 4");
int input = 19; // change the input as you want, I have set it 19 for testing
Integer c = message.keySet().stream()
.min(Comparator.comparingInt(i -> Math.abs(i - input))).get(); // find the closest number to the input
String result = message.get(c);
System.out.println("result : "+result);
输出:
result : Message 2
答案 2 :(得分:0)
int input = 19;
int roundInput = BigDecimal
.valueOf(input)
.divide(BigDecimal.TEN,0,BigDecimal.ROUND_HALF_UP)
.multiply(BigDecimal.TEN)
.intValue();
答案 3 :(得分:0)
您可以扩展HashMap
以添加您特定的所需行为:
public class ApproximateKeyMap<K, V> extends HashMap<K, V> {
@Override
public V get(Object key) {
// Map your key -> approximated key
K approximatedKey = ...
return super.get(approximatedKey);
}
}
现在使用您的ApproximateKeyMap
代替HashMap
。
为防止误操作,您可以添加辅助功能而不是覆盖:
public class ApproximateKeyMap<K, V> extends HashMap<K, V> {
public V getApproximate(Object key) {
// Map your key -> approximated key
K approximatedKey = ...
return super.get(approximatedKey);
}
}