Java 在ArrayList中搜索对象

Java 在ArrayList中搜索对象,java,collections,arraylist,binary-search,Java,Collections,Arraylist,Binary Search,我将对象存储在ArrayList中,我的pojo如下所示 public class POJOSortableContacts { private Long id; private String displayName; public POJOSortableContacts(Long id, String displayName) { super(); this.id = id; this.disp

我将对象存储在ArrayList中,我的pojo如下所示

public class POJOSortableContacts {
    private Long id;
    private String displayName;


    public POJOSortableContacts(Long id, String displayName) {

        super();
        this.id           = id;
        this.displayName  = displayName;
    }

    //Setter and Getters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    //This will be used to sectioned header.
    public String getLabel() {
        return Character.toString(displayName.charAt(0)).toUpperCase();
    }



    //Sortable categories
    //Sort by Contact name
    public static Comparator<POJOSortableContacts> COMPARE_BY_NAME = new Comparator<POJOSortableContacts>() {
        public int compare(POJOSortableContacts one, POJOSortableContacts other) {
            return one.getDisplayName().compareToIgnoreCase(other.getDisplayName());
            //return s1.toLowerCase().compareTo(s2.toLowerCase()); //it returns lower_case word first and then upper_case
        }
    };

    //Sort by id
    public static Comparator<POJOSortableContacts> COMPARE_BY_ID = new Comparator<POJOSortableContacts>() {
        public int compare(POJOSortableContacts one, POJOSortableContacts other) {
            return one.id.compareTo(other.id);
        }
    };
}
公共类POJOSortableContacts{
私人长id;
私有字符串显示名;
公共POJOSortableContacts(长id,字符串显示名称){
超级();
this.id=id;
this.displayName=displayName;
}
//二传手和接球手
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getDisplayName(){
返回显示名;
}
public void setDisplayName(字符串displayName){
this.displayName=displayName;
}
//这将用于分段收割台。
公共字符串getLabel(){
返回Character.toString(displayName.charAt(0)).toUpperCase();
}
//可排序类别
//按联系人姓名排序
公共静态比较器COMPARE_BY_NAME=新比较器(){
公共int比较(POJOSortableContacts one,POJOSortableContacts other){
返回一个.getDisplayName().compareToIgnoreCase(其他.getDisplayName());
//返回s1.toLowerCase().compareTo(s2.toLowerCase());//首先返回小写单词,然后返回大写单词
}
};
//按id排序
公共静态比较器COMPARE_BY_ID=新比较器(){
公共int比较(POJOSortableContacts one,POJOSortableContacts other){
返回一个.id.compareTo(其他.id);
}
};
}
Arraylist结构如下所示

ArrayList<POJOSortableContacts> contactArrayList = new ArrayList<POJOSortableContacts>() 
ArrayList contactArrayList=new ArrayList()
,我想通过id从contactArrayList中搜索一个对象(例如,我想要一个id为20的对象),我想使用binarysearch来搜索这个对象。那怎么可能呢?

你可以使用

POJOSortableContacts contact = Collections.binarySearch(contactArrayList,
                                               new POJOSortableContacts(20, ""),
                                               COMPARE_BY_ID);
新的
POJOSortableContacts
只是一个用作键的虚拟对象


当然,这只有在列表按ID排序时才起作用-不能对未排序的列表(或以不同方式排序的列表)使用二进制搜索。

要使用二进制搜索,必须对集合进行排序。您可以在每次搜索之前对
ArrayList
进行排序,但这将否定使用二进制搜索的优势(您可以在未排序的列表上进行线性搜索,而且速度更快)。

我建议您使用HashMap

Map<Long,POJOSortableContacts> contactMap = new HashMap<Long,POJOSortableContacts>();
然后搜索就变得微不足道了:

POJOSortableContacts myContact = contactMap.get(myID);

ArrayList有一个方法-BinarySearch,它将要搜索的对象作为参数

POJOSortableContacts contactToSearch = new POJOSortableContacts(someId, "Name");
POJOSortableContacts myContact = contactArrayList.BinarySearch(contactToSearch);    

希望这能有所帮助。

稍微回避一下这个问题,如果列表中没有重复项,那么最好使用
分类数据集来存储联系人。在使用binarySearch之前不再进行排序…

我正在使用Collections.sort(contactArrayList,POJOSortableContacts.COMPARE BY_ID);整理我的收藏。那我怎么才能得到那个对象/值呢?@pankaj:你使用Collections.binarySearch的结果。我编辑了我的答案来证明这一点。如果我有超过5000个对象,那么我应该选择什么?我很困惑。我更喜欢二进制搜索,因为它比线性搜索快。@pankaj:如果列表总是排序的,那么二进制搜索显然是更好的解决方案。但是如果你在每次搜索之前都要进行排序,那么你可能会人为地放慢速度。但这在很大程度上取决于你的代码和环境。是的,这会很好。但我必须有一个按名称排序的对象列表。这就是我使用ArrayList的原因。如果是这种情况,您必须(重新)排序
ArrayList
,然后才能进行二进制搜索。
POJOSortableContacts contactToSearch = new POJOSortableContacts(someId, "Name");
POJOSortableContacts myContact = contactArrayList.BinarySearch(contactToSearch);