Java 等于或介于两个值之间的Lookupvalue
我有一个CSV文件,它将一个地区链接到一个邮政编码。看起来是这样的(最低拉链,最高拉链,地区): 我需要一个基于邮政编码返回区域的函数。大概是这样的:Java 等于或介于两个值之间的Lookupvalue,java,collections,Java,Collections,我有一个CSV文件,它将一个地区链接到一个邮政编码。看起来是这样的(最低拉链,最高拉链,地区): 我需要一个基于邮政编码返回区域的函数。大概是这样的: 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 1600,1
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
1600,1
1601,1
1602,1
...
1799,1
1800,2
1801,2
...
我目前实现这一点的方式是使用HashMap
。当我读取CSV时,我迭代1600到1799之间的每个值,为每个邮政编码/地区组合创建一个键值对,并对CSV中的每一行重复该操作。结果是一个如下所示的HashMap
:
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
1600,1
1601,1
1602,1
...
1799,1
1800,2
1801,2
...
这将创建一个大的
HashMap
,它确实有效。有没有比将这个小表分解为一个大的HashMap
更高效的(内存)实现呢?下面类似的方法会有所帮助-
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;
classziprange{
int启动;
内端;
}
//通过csv填写此地图
地图区域;
int-zipToSearch=2870;
//创建方法,该方法返回对应于区域的整数
用于(ZipRange zip:zipToRegion.keySet()){
如果(zipToSearch>=zip.start&&zipToSearch下面类似的内容将有所帮助-
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;
classziprange{
int启动;
内端;
}
//通过csv填写此地图
地图区域;
int-zipToSearch=2870;
//创建方法,该方法返回对应于区域的整数
用于(ZipRange zip:zipToRegion.keySet()){
如果(zipToSearch>=zip.start&&zipToSearch我想你想要一个我想你想要一个我想你想要为你的ZipRange
类实现hashCode
和equals
)是的,当然。这是为了给出关于要使用的数据结构和搜索算法的基本概念。如果输入间隔不重叠,你可以“滥用”hashCode
和等于ZipRange(16001799)
和ZipRange(16421642)
都是一样的…那么你就不需要根据OP的要求在键集上循环,这是不可能的。我想你应该为你的ZipRange
类实现hashCode
和equals
)是的,当然。这是为了给出使用数据结构和搜索算法的基本概念。如果输入间隔不重叠,您可能会“滥用”hashCode
和等于,从而ZipRange(16001799)
和ZipRange(16421642)
都是一样的…那么你就不需要根据OP的要求在键集上循环,这是不可能的。我想到了。我用python创建了一个sklearn.tree来查看它的外观。ZIP和region之间的关系没有太多逻辑,它会导致一个复杂的树,我无法改变数据的存储方式马丁伯格:我指的不是像sklearn.Tree
那样的“决策树”,而是“段树”或“区间树”“:谢谢。看起来很有趣。我会研究一下。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面更改,只有链接的答案可能会无效。-@GHajba:你说得对,但是,我认为Web是关于“链接到信息”的。”我没有“复制它”:…而且,我也没有时间写太多:)我想到了这一点。我用python创建了一个sklearn.tree来查看它的外观。ZIP和region之间的关系没有太多逻辑,它导致了一个复杂的树,我无法改变数据传递给我的方式。@MartijnBurger:我不是指“决策树”类似于sklearn.Tree
提供的那些,但是是“段树”或“区间树”“:谢谢。看起来很有趣。我会研究一下。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面更改,只有链接的答案可能会无效。-@GHajba:你说得对,但是,我认为Web是关于“链接到信息”的。”与其说是“复制它”:…而且,我并不总是有时间写很多:)