Java 二进制搜索对象数组中的元素字段

Java 二进制搜索对象数组中的元素字段,java,arrays,eclipse,arraylist,binary-search,Java,Arrays,Eclipse,Arraylist,Binary Search,是否仍然可以搜索对象的二进制数组,而不是数组的完整元素,而是包含特定字段值的元素?目前,我所看到的唯一方法是创建一个新的“Entry”对象进行搜索,因为与实现相比,第二个字段“initial”包含什么并不重要 如果数组已经按姓氏排序,是否有一种实现二进制搜索的方法,这样我就可以直接搜索姓氏.element字段 我知道我可以遍历数组来搜索每个元素的字段,但在这种情况下,我需要使用binarySearch public class Entry implements Comparable<Ent

是否仍然可以搜索对象的二进制数组,而不是数组的完整元素,而是包含特定字段值的元素?目前,我所看到的唯一方法是创建一个新的“Entry”对象进行搜索,因为与实现相比,第二个字段“initial”包含什么并不重要

如果数组已经按姓氏排序,是否有一种实现二进制搜索的方法,这样我就可以直接搜索姓氏.element字段

我知道我可以遍历数组来搜索每个元素的字段,但在这种情况下,我需要使用binarySearch

public class Entry implements Comparable<Entry> { //implements allows sorting
    public String surname;
    public char intial;

 public Entry(String surname, String initial, int number) {
    this.surname = surname.toUpperCase();
    this.intial = initial.toUpperCase().charAt(0); // if whole name entered 
                                                   //takes first letter only

}

@Override
public int compareTo(Entry o) {

    else {
        return this.surname.compareTo(o.surname);
    }

}

public class EntryList {

    public static main(String[] args) {

    List<Entry> directory = new ArrayList<Entry>(); 

    directory.add(new Entry("surname", "intial")); 
            int i = Collections.binarySearch(directory, new Entry("surname", " ")); //doesnt matter whats in intial field
    }
}


}
公共类条目实现可比较{//implements允许排序
公共字符串姓氏;
公共性质;
公共条目(字符串姓氏、字符串首字母、整数){
this.lasname=姓氏.toUpperCase();
this.initial=initial.toUpperCase().charAt(0);//如果输入了全名
//只取第一个字母
}
@凌驾
公共整数比较(条目o){
否则{
返回此。姓氏。比较(o.姓氏);
}
}
公共类入口列表{
公共静态main(字符串[]args){
List directory=new ArrayList();
添加(新条目(“姓氏”、“初始”);
int i=Collections.binarySearch(目录,新条目(“姓氏”,“名称”);//初始字段中的内容无关紧要
}
}
}

你的问题没有多大意义

二进制搜索对已排序的集合有效,因此当然您的元素必须具有可比性。定义你的<代码> > > <代码> >代码>等于方法只考虑<代码>姓氏< /代码>字段,然后可以使用<代码> EDIT:我仍然不确定您是询问库函数
binarySearch
的用法,还是询问自定义二进制搜索函数的实现

对于第一种情况,答案是否定的,API中不存在这样的
binarySearch
重载。通常,在数组中,您希望按实体相等进行搜索,因为在该方法的预期用例中,您已经有了要搜索的实体,但您不知道它是否包含在目标数组中,以及在哪个索引上可以找到。但是,您希望通过键搜索实体,这可能表明您误用了
ArrayList
binarySearch
SortedMap
更适合此任务


另一方面,如果您坚持使用
ArrayList
,那么您当然可以实现一种类似于二进制搜索的方法,该方法只使用您的
姓氏
字段进行匹配。

感谢您的评论,尤其是关于无用代码行的评论。重新措辞一个措辞不当的问题(道歉)-假设相等和比较方法已经被改写为只考虑“姓氏”字段,有没有一种方法可以实现.binarySearch w/out创建一个新的条目对象作为第二个参数?@davidhood2编辑了我的答案作为回应。@poroszd您可以实现一个方法,它是标准库中的
binarySearch
的门面,而不是直接实现二进制搜索。该方法将使用私有构造函数,该构造函数仅使用比较中使用的字段初始化对象,然后调用二进制搜索。还是我遗漏了什么?@Wrap2Win不,你是对的,重复使用
集合。binarySearch
比滚动你自己的实现要好。