Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 高效地查找对象数组中的元素_Java_Arrays_Search - Fatal编程技术网

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
键来自何处?@fge
Integer
是对象的“自动装箱”位置ID。根本没有真正的工作。不确定你所说的有
O(1)
搜索
HashSet
vs
O(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;
    }
}