如何在映射中存储一系列整数对



我有代码,我需要将一系列 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 倍(

最新更新