如何在地图中存储一系列int对

时间:2017-07-27 07:14:16

标签: java

我有代码,我需要将一系列y-y和z-z坐标存储为HashMap的一个单一键。

目前,我正在遍历每个y和z坐标;将它们包装在元组中,然后将该元组保存为指定值的键。然而,这对我来说似乎并不高效,因为内存使用可能会成为一个问题。

假设我的y范围介于50-100之间,z范围也介于50-100之间。是否可以存储y和z范围,并作为有效示例(75,75)检索映射到范围的值? 101,101将是一个无效的例子。

最后,我还需要防止密钥对与x或z重叠。

如果有人能帮助我,我会很感激,因为我很困惑。

此致

2 个答案:

答案 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放入两个范围

编辑 - 效果:

  • 在地图中添加6000个随机元素:<5ms
  • 使用nanoTime()计算使用getValue()所需的时间:
    • getValue() 20000次:100ms< t < 150ms
    • System.out.println(getValue()) 20000次:850ms< t <1sec

您询问了大约3000个元素和1000 getValue()<5ms(比1秒低200倍)