我有一个将区域链接到邮政编码的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
?
答案 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