有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查找最接近键的最小值

public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();

        map.put(30, "");
        map.put(20, "");
        map.put(50, "");
        map.put(60, "");
        map.put(70, "");

        System.out.println(map.containsKey(20));

    }

}

我试图从上面的代码做什么

  1. 是否正在尝试搜索地图中的号码
  2. 我们可以很容易地检查密钥是否可用或不使用containsKey

如果密钥不可用,则我需要从 地图

例如,如果试图获取地图中不可用的40,则 contains键抛出false,然后它将返回30,因为它是 最接近的最小数量为40

怎么弄到的


共 (3) 个答案

  1. # 1 楼答案

    对于您的情况,HashMap不是正确的数据结构,最好使用NavigableMap来使用floorKey,ceilingKey将为您获取最近的或当前的密钥。 另一种方法是最好在HashMap键集上执行排序算法并获取最近的

    int key = 20;
    NavigableMap<Integer, Object> map = new TreeMap<Integer , Object>();
    
    Integer before = map.floorKey(key);
    Integer after = map.ceilingKey(key);
    if (before == null)  System.out.println(after);
    if (after == null)  System.out.println(before);
    
    System.out.println((key - before < after - key 
            || after - key < 0) 
            && key - before > 0 ? before : after);  
    
  2. # 2 楼答案

    这会奏效的。但是,如果您的输入是最小值,则需要进行一些修改

    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
    
        map.put(30, "");
        map.put(20, "");
        map.put(50, "");
        map.put(60, "");
        map.put(70, "");
    
        System.out.println(getNearestMinimum(map,31));
    
    }
    
    private static int getNearestMinimum(Map<Integer, String> map, int key){
        int minimum = Integer.MAX_VALUE;
        int minDif = Integer.MAX_VALUE;
        for (Integer integer : map.keySet()) {
            int dif = key - integer;
            if(dif >= 0 && dif< minDif){
                minimum = integer;
                minDif = dif;
            }
        }
        return minimum;
    }
    
  3. # 3 楼答案

    您可以这样做:

    map.keySet().stream()
                .filter(key -> key < YOUR_VALUE)
                .sorted(Comparator.reverseOrder()) 
                .findFirst().orElse(null);
    

    map.keySet().stream()
                    .filter(key -> key < YOUR_VALUE)
                    .min(Comparator.reverseOrder())
                    .orElse(null)