Pankaj Kumar
Pankaj Kumar

Reputation: 82958

Searching an object in ArrayList

I am storing objects in ArrayList, where my pojo is as

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);
        }
    };
}

and Arraylist structure is as

ArrayList<POJOSortableContacts> contactArrayList = new ArrayList<POJOSortableContacts>() 

, I want to search an object from contactArrayList by id (for example I want an object which id is 20), I want to use binarysearch for this. So how can it will be?

Upvotes: 0

Views: 4573

Answers (5)

Bruno Roh&#233;e
Bruno Roh&#233;e

Reputation: 3534

Sidestepping the question a bit, if you can't have duplicates in the list you'd likely be better served by using a SortedSet to store the contacts. No sorting before using binarySearch anymore...

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1500555

You can use

POJOSortableContacts contact = Collections.binarySearch(contactArrayList,
                                               new POJOSortableContacts(20, ""),
                                               COMPARE_BY_ID);

The new POJOSortableContacts is just a dummy object to act as the key.

Of course, this will only work if your list is sorted by ID to start with - you can't use a binary search on an unsorted list (or on a list which is sorted in a different way).

Upvotes: 1

OrahSoft
OrahSoft

Reputation: 803

ArrayList has a method - BinarySearch, which takes object to search as a parameter.

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

Hope this helps.

Upvotes: 0

Niel de Wet
Niel de Wet

Reputation: 8398

I will rather suggest that you use a HashMap.

Map<Long,POJOSortableContacts> contactMap = new HashMap<Long,POJOSortableContacts>();

Fill up your contactMap like this:

contactMap.put(myContact.getId(), myContact);

Searching then becomes trivial:

POJOSortableContacts myContact = contactMap.get(myID);

Upvotes: 1

Joachim Sauer
Joachim Sauer

Reputation: 308031

To be able to use binary search, your collection must be sorted. You could sort your ArrayList each time before your search, but that would negate the advantage of using binary search (you could just do a linear search over the unsorted list and still be faster).

Upvotes: 0

Related Questions