通过近似ID值从hashmap获取消息,而不是相同的ID值

时间:2018-06-13 16:23:20

标签: java hashmap

说我有这样的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 ”。我怎样才能做到这一点?

4 个答案:

答案 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);
    }
}