可以将一系列键映射到值的数据结构

Sak*_*ura 18 java dictionary data-structures range-map

我试图找到一个数据结构,从一系列值中获取特定值并将其映射到一个键.

例如,我有以下条件:

  1. 从1到2.9,我想将它映射到A.
  2. 从4到6,我想将它映射到B.
  3. 从6.5到10,我想将它映射到C.

我的值为5,我想将其映射到一个键.所以基于上述条件,我应该将它映射到B.

Java中是否有任何人可以向我推荐解决问题的数据结构?

目前我使用的哈希表只能将值映射到键.我尝试将值范围映射到哈希表中存在的特定值.但是,我陷入了将值范围映射到特定值的问题.所以现在我试图用另一种方法将值的范围映射到键.有谁知道如何解决这个问题?

编辑:

感谢Martin Ellis,我决定使用TreeMap来解决这个问题.

Mar*_*lis 35

您的范围是否不重叠?如果是这样,您可以使用TreeMap:

TreeMap<Double, Character> m = new TreeMap<Double, Character>();
m.put(1.0, 'A');
m.put(2.9, null);
m.put(4.0, 'B');
m.put(6.0, null);
m.put(6.5, 'C');
m.put(10.0, null);
Run Code Online (Sandbox Code Playgroud)

由于您可能需要包含性查找(即2.9映射到"A",而不是未定义),因此查找逻辑有点复杂:

private static <K, V> V mappedValue(TreeMap<K, V> map, K key) {
    Entry<K, V> e = map.floorEntry(key);
    if (e != null && e.getValue() == null) {
        e = map.lowerEntry(key);
    }
    return e == null ? null : e.getValue();
}
Run Code Online (Sandbox Code Playgroud)

例:

mappedValue(m, 5) == 'B'
Run Code Online (Sandbox Code Playgroud)

更多结果包括:

0.9 null
1.0 A
1.1 A
2.8 A
2.9 A
3.0 null
6.4 null
6.5 C
6.6 C
9.9 C
10.0 C
10.1 null
Run Code Online (Sandbox Code Playgroud)


Vad*_*zim 10

Guava RangeMap 提供开箱即用的专业解决方案:

RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closed(1, 100), "foo"); // {[1, 100] => "foo"}
rangeMap.put(Range.open(3, 6), "bar"); // {[1, 3] => "foo", (3, 6) => "bar", [6, 100] => "foo"}

rangeMap.get(42); // returns "foo"
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这个答案得到的赞成票这么少。看起来对我来说非常有用。只是要注意:rangeMap.get(3); // 返回“foo” rangeMap.get(5); // 返回“bar” rangeMap.get(6); // 返回“foo” 另请注意 Range.closeOpen() 和 Range.openClosed() 方法返回半开/闭范围。 (2认同)