在范围列表中查找邮政编码



我有一个邮政编码范围的列表,这样一个地区可以有多个邮政编码。

class Zip {
Long rangeStart;    // zip code range first
Long rangeEnd;      // zip code range last
String regionName;
}

输入1:List<Zip> zipList输入2:Long zipCodeToSearch

不存在重叠范围。

我必须设计一个解决方案,当用户输入邮政编码时,我必须查找List<Zip>并返回其区域名称。

我必须解决zipList排序时和未排序时的问题。

zipList使用二进制搜索排序时的我的解决方案:

  1. 创建一个HashMap<Integer, String>,存储一个索引&地区名称。例如

1->夏威夷
2->LA
3->NY

  1. 创建一个列表,存储范围的开始和结束。即
List<Long> rangeList;
for (Zip zip : zipList) {
rangeList.add(zip.rangeStart);
rangeList.add(zip.rangeEnd);
}
  1. 使用二进制搜索反复检查zipCodeToSearch是否在mid及其邻居范围内

说到邻居,我的意思是,我会像在二进制搜索中一样检查左和右。如果找到结果,则返回map.get(mid/2)

zipList未排序时的我的解决方案:

这基本上是线性搜索,我检查如下:

for (int i = 1; i < rangeList.size(); i += 2) {
if (rangeList.get(i - 1) <= zipCodeToSearch && zipCodeToSearch <= rangeList.get(i)) {
return i / 2;
}
}

有更好的解决方案吗?

迭代Zip列表

static Zip getZip(List<Zip> zipList, long range) {
for (Zip zip: zipList)
if (range >= zip.rangeStart && range <= zip.rangeEnd)
return zip;
}

您可以向Zip类添加一个方法来检查邮政编码是否在范围内:

class Zip {
Long rangeStart;
Long rangeEnd;
String regionName;
public boolean isInRange(long zip) {
return zip >= rangeStart && zip <= rangeEnd;
}
}

然后您可以stream并过滤zipList以获得区域名称:

public static String findRegionName(List<Zip> zipList, long searchZip) {
return zipList.stream().filter(zip -> zip.isInRange(searchZip))
.map(Zip::getRegionName).findAny().orElse(null);
}

最新更新