我有代码,我需要将一系列y-y和z-z坐标存储为HashMap的一个单一键。
目前,我正在遍历每个y和z坐标;将它们包装在元组中,然后将该元组保存为指定值的键。然而,这对我来说似乎并不高效,因为内存使用可能会成为一个问题。
假设我的y范围介于50-100之间,z范围也介于50-100之间。是否可以存储y和z范围,并作为有效示例(75,75)检索映射到范围的值? 101,101将是一个无效的例子。
最后,我还需要防止密钥对与x或z重叠。
如果有人能帮助我,我会很感激,因为我很困惑。
此致
答案 0 :(得分:0)
您可能正在寻找IntervalTree。
我刚刚发布了一个示例here。
答案 1 :(得分:0)
我从你的实现中做了一些假设:
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
放入两个范围
编辑 - 效果:
<5ms
nanoTime()
计算使用getValue()
所需的时间:
getValue()
20000次:100ms< t < 150ms
System.out.println(getValue())
20000次:850ms< t <1sec
您询问了大约3000个元素和1000 getValue()
:<5ms
(比1秒低200倍)