Java 高效地查找对象数组中的元素
我有一个非常长的对象数组:Java 高效地查找对象数组中的元素,java,arrays,search,Java,Arrays,Search,我有一个非常长的对象数组: public static class __Location { public __Location(int locationId, String locationDesc) { this.LocationId = locationId; this.LocationDesc = locationDesc; } public int LocationId; public String LocationDe
public static class __Location {
public __Location(int locationId, String locationDesc) {
this.LocationId = locationId;
this.LocationDesc = locationDesc;
}
public int LocationId;
public String LocationDesc;
}
public static __Location[] LOCATIONS = { new __Location(100, "Afghanistan"), new __Location(110, "Albania"), new __Location(120, "Algeria"),
new __Location(130, "American Samoa"), new __Location(140, "Andorra"), new __Location(150, "Angola"), new __Location(160, "Anguilla"),
new __Location(170, "Antarctica"), new __Location(180, "Antigua And Barbuda"), new __Location(190, "Argentina"), new __Location(200, "Armenia"),
new __Location(210, "Aruba"), new __Location(220, "Australia"), new __Location(230, "Austria"), new __Location(240, "Azerbaijan"),
new __Location(250, "Bahamas"), new __Location(260, "Bahrain"), new __Location(270, "Bangladesh"), new __Location(280, "Barbados"),
new __Location(290, "Belarus"), new __Location(300, "Belgium"), new __Location(310, "Belize"), new __Location(320, "Benin"),
new __Location(330, "Bermuda"), new __Location(340, "Bhutan"), new __Location(350, "Bolivia"), new __Location(360, "Bosnia And Herzegovina"),
new __Location(370, "Botswana"), new __Location(380, "Bouvet Island"), new __Location(390, "Brazil"),
new __Location(400, "British Indian Ocean Territory"), ...
我的问题是如何在这个长数组中高效地搜索项目(根据其键值,即LocationId)。使用
HashMap
可以高效地访问项目,时间复杂度为O(1)
:
Map Map=newhashmap();
此
HashMap
的键是LocationId
,值是相应的\u位置对象
如果使用键,为什么不尝试使用映射
这样,您就可以通过它的键从上下文中查找值,我假设这就是您想要做的事情。考虑使用哈希集
Set<_location> locationSet = new HashSet<_location>();
locationSet.add(new __Location(130, "American Samoa"));
...
_location searchLocation = //some _location instance;
if (locationSet.contains(searchLocation)) {
//found it
}
Set locationSet=newhashset();
locationSet.add(新位置(130,“美属萨摩亚”);
...
_location searchLocation=//某些_位置实例;
if(locationSet.contains(searchLocation)){
//找到了
}
您需要重写_location类的hashcode和equals方法,以便相等性由locationID确定
这比需要遍历的数组搜索更有效。首先,将\u位置
重命名为位置
第二:你说的是“高效搜索”,很好。现在回答以下两个问题:
- 您要搜索的位置来自何处?这是新位置()的结果吗?这个位置的id?这个位置的字符串
- 在要从中查找的容器中,现有位置是否已排序?如果是,反对什么?身份证?绳子
如果这个问题没有明确的答案,就不可能回答你的问题
我们假设,因为这是最简单的情况,一个位置
由它的位置id
标识;您知道,对于给定的locationId
,locationString
将是唯一的
为了获得最大效率,您应该在位置中实现.equals()
/.hashCode()
契约,并使用HashSet
:
public static class Location {
private final int locationId;
private final String locationDesc;
public Location(final int locationId, final String locationDesc)
{
this.locationId = locationId;
this.locationDesc = locationDesc;
}
@Override
public int hashCode()
{
return locationId;
}
@Override
public boolean equals(final Object obj)
{
if (obj == null)
return false;
if (this == obj)
return true;
if (getClass() != obj.getClass())
return false;
final Location other = (Location) obj;
return locationId == other.locationId;
}
}
使用“<代码> HASSET < /代码>插入该<代码>设置<代码> >代码>包含()/代码>方法.< /P>如果数组被排序,则可以使用二进制搜索。是代码>位置ID < /代码>唯一的吗?如果您的数组中的所有位置都是唯一的,则应考虑执行<代码> .Quals](< /代码> /<代码> .HASCODE())。
并使用哈希集
@Solace良好点,但这需要\u位置
来实现可比
,或使用比较器
请使用-类应在PascalCase
中命名<代码>\u位置
应该是位置
。这需要一些工作才能完成。。。例如,Integer
键来自何处?@fgeInteger
是对象的“自动装箱”位置ID。根本没有真正的工作。不确定你所说的有O(1)
搜索HashSet
vsO(n)
搜索数组是什么意思。HashSet
有一个O(1)
包含
方法,但这无助于搜索给定的索引。需要详细说明吗?@Boristeider我只是假设OP想要搜索和评估集合中是否包含给定的位置。在反射中,如果OP实际上对检索值locationDesc感兴趣,那么HashMap是更好的实现。Map
是一个合适的接口,但它仍然影响使用哪个实现。例如,我强烈建议对除原语值包装器对象以外的任何对象类的hashSet
使用不可变键的hashMap
。+1可全面分解缺失的信息。我想我还是更喜欢这里的Map
。但是关键是什么呢?我会说id
——因为这让代码的意图变得清晰。它还允许按集合
不允许的id进行查找。OP使用单词搜索,这给我的印象是OP想要找到一个位置给定id
。好的,另一个解决方案可能是根据标准使用番石榴的等价物。)@NedNowotny你的话没有任何意义;如果您确实想了解它的优点,请查看HashMap
的实现。
public static class Location {
private final int locationId;
private final String locationDesc;
public Location(final int locationId, final String locationDesc)
{
this.locationId = locationId;
this.locationDesc = locationDesc;
}
@Override
public int hashCode()
{
return locationId;
}
@Override
public boolean equals(final Object obj)
{
if (obj == null)
return false;
if (this == obj)
return true;
if (getClass() != obj.getClass())
return false;
final Location other = (Location) obj;
return locationId == other.locationId;
}
}