Поиск объекта в ArrayList - PullRequest
0 голосов
/ 07 марта 2011

Я храню объекты в 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);
        }
    };
}

, а структура Arraylist имеет вид

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

, я хочу найти объект из contactArrayList по id (например, я хочу объект с идентификатором 20), я хочу использовать двоичный поиск для этого.Так как это может быть?

Ответы [ 5 ]

1 голос
/ 07 марта 2011

Я скорее рекомендую вам использовать HashMap.

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

Заполните свой контактКарта так:

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

Поиск становится тривиальным:

POJOSortableContacts myContact = contactMap.get(myID);
1 голос
/ 07 марта 2011

Вы можете использовать

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

Новый POJOSortableContacts - всего лишь фиктивный объект, действующий в качестве ключа.

Конечно, это будет работать только в том случае, если ваш список для начала сортируется по идентификатору - вы не можете использовать двоичный поиск в несортированном списке (или в списке, который сортируется другим способом).

0 голосов
/ 07 марта 2011

Если немного обойти вопрос, если у вас не будет дубликатов в списке, вам, скорее всего, будет лучше обслуживаться с помощью SortedSet для хранения контактов. Нет сортировки перед использованием binarySearch больше ...

0 голосов
/ 07 марта 2011

ArrayList имеет метод - BinarySearch, который принимает объект для поиска в качестве параметра.

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

Надеюсь, это поможет.

0 голосов
/ 07 марта 2011

Чтобы использовать двоичный поиск, ваша коллекция должна быть отсортирована. Вы можете сортировать ArrayList каждый раз перед поиском, но это сведет на нет преимущество использования бинарного поиска (вы можете просто выполнить линейный поиск по несортированному списку и при этом быть быстрее).

...