我有代码,我需要将一系列 y-y 和 z-z 坐标存储为 HashMap 的单个键。
目前,我正在遍历每个 y 和 z 坐标;将它们包装在一个元组中,然后将该元组保存为指定值的键。然而,这对我来说似乎并不有效,因为内存使用可能会成为一个问题。
假设我的 y 范围在 50-100 之间,z 范围也在 50-100 之间。是否可以存储 y 和 z 范围并作为有效示例 (75,75( 检索映射到范围的值?101,101 将是一个无效的示例。
最后,我还需要防止密钥对与 x 或 z 重叠。
如果有人能帮助我解决这个问题,我将不胜感激,因为我感到困惑。
问候
您可能正在寻找一个 IntervalTree。
我不久前在这里发布了一个例子。
我从你的实现中做了一些假设:
public class Range {
private final int from;
private final int to;
}
// - - AND - -
public class Tuple {
private final Range rf;
private final Range rt;
}
我建议添加以下方法:
// In Range class
public boolean isValid(int x) {
return (from <= x) && (x <= to);
}
//-----------------------------------------------------------------
// In Tuple class
public boolean isValid(int x, int y) {
return rf.isValid(x) && rf.isValid(y);
}
还有一个类来管理你的东西:
public class TupleGestion {
private static final Map<Tuple, String> map = new HashMap<>();
private static String getValue(int x, int y) {
return map.get(map.keySet().stream()
.filter(key -> key.isValid(x, y)).findAny().orElse(null));
}
public static void main(String[] args) {
map.put(new Tuple(new Range(25, 75), new Range(25, 75)), "foo");
System.out.println(getValue(0, 0)); // null
System.out.println(getValue(50, 0)); // null
System.out.println(getValue(0, 50)); // null
System.out.println(getValue(50, 50)); // foo
}
}
这将读取密钥并找到与您的温度相对应的密钥,将 2 个ints
放入两个范围
编辑 - 性能 :
- 在地图中添加6000个随机元素:
<5ms
使用 nanoTime()
计算使用getValue()
所需的时间:- 仅
getValue()
20000次:100ms< t < 150ms
System.out.println(getValue())
20000次:850ms< t <1sec
- 仅
您询问了大约 3000 个元素和 1000 个getValue()
:<5ms
(比 1 秒低 200 倍(