Lookupvalue相等或介于两个值之间

时间:2016-04-20 09:17:26

标签: java collections

我有一个将区域链接到邮政编码的CSV文件。它看起来像这样(最低拉链,最高拉链,区域):

1600,1799,1
1800,1899,1
4300,4699,1
2820,2839,2
2850,2879,2
2930,2949,2
5600,5819,3
5850,6514,3
6516,6549,3
6800,6849,3

我需要一个基于邮政编码返回区域的函数。像这样:

foo = getRegion(1600) // foo is set to 1
bar = getRegion(1642) // bar is set to 1
baz = getRegion(4351) // baz is set to 2
qux = getRegion(1211) // qux is set to null

我目前实现此方法的方法是使用HashMap。当我读取CSV时,我遍历1600和1799之间的每个值,并为每个邮政编码/区域组合创建一个键值对,并对CSV中的每一行重复该值。结果是HashMap看起来像这样:

1600,1
1601,1
1602,1
...
1799,1
1800,2
1801,2
... 

这会创建一个很大的HashMap,它可以正常工作。是否有更多(内存)高效的实现,而不是将这个小表扩展为大HashMap

2 个答案:

答案 0 :(得分:1)

下面的内容会有所帮助 -

class ZipRange {
    int start;
    int end;
}

// Fill up this map parsing through csv
Map<ZipRange, Integer> zipToRegion;

int zipToSearch = 2870;

// Create method which returns integer which corresponds to region
for (ZipRange zip : zipToRegion.keySet()) {
    if (zipToSearch >= zip.start && zipToSearch <= zip.end) {
        return zipToRegion.get(zip);
    }
}
return -1;

答案 1 :(得分:1)

我想你想要一个segment tree