Найти элемент в ArrayList в Java? - PullRequest
2 голосов
/ 04 декабря 2011

В C # найти элемент в ArrayList с определенным свойством довольно просто:

mSelectedBoard = mBoardConnections.FirstOrDefault(bcd => bcd.Id == id);

Это самое простое из того, что я нашел в Java (если бы я мог позволить себе MonoTouch для Android):

for ( BoardConnectionData bcd : mBoardConnections ) {
    if (bcd.getID() == id) {
      mSelectedBoard = bcd;
      break;
    }
}

Мне не хватает более простого способа сделать это?

Спасибо!

Ответы [ 8 ]

1 голос
/ 04 декабря 2011

Определите значащее equals и используйте Collection.contains.

Существует ряд библиотек утилит, которые содержат реализации, использующие различные слова "Я так?"Реализации.( Guava , Commons Collections и т. Д.)

Другой вариант заключается в создании типизированной коллекции, содержащей служебные методы, находящие элементы по произвольным критериям.

В любом случае показанный фрагмент кода не должен находиться в основном коде, он должен быть абстрагирован в собственный метод, независимо от того, где он в конечном итоге живет.

0 голосов
/ 25 сентября 2015

В Java 8 вы можете сделать так:

mSelectedBoard = mBoardConnections
    .stream().filter(bcd -> bcd.Id == id).findFirst().orElse(null);
0 голосов
/ 04 декабря 2011

Вы действительно должны спросить себя, является ли ArrayList правильной структурой данных.Учитывая схожую задачу, я бы выбрал Map.И C #, и Java потребуется O (N) для поиска в массиве.Использование карты O (1).Если это то, что вам нужно часто, то я бы предложил правильную структуру.

На самом деле единственная разница между версией C # и Java заключается в том, что она короче и использует замыкание.Как и многие другие люди предложили, вы можете сделать то же самое с некоторыми существующими библиотеками.Никто на самом деле не показал никакого кода, хотя.С Guava вы можете сделать:

Iterables.find(new Predicate<Data>(){
public boolean apply(Data d){
 return d.id == someId;
)}, list);

Или, если вам нужно значение по умолчанию, вы можете использовать .find (предикат, список, defaultValue) .

0 голосов
/ 04 декабря 2011

Чтобы получить ответ Дэйва Ньютона.Collection - это ArrayList, поэтому при соответствующей реализации equals (плюс hashCode) для BoardConnectionData метод indexOf позволит выражение

selectedBoard = boardConnections.getAt(boardConnections.indexOf(new BoardConnectionData(id)))

Конечноскорее всего, предпочтительнее создать тестовый объект, чем создавать полноценный экземпляр только из идентификатора.

0 голосов
/ 04 декабря 2011

Если вы наследуете от Comparable, чтобы проверить член id и использовать SortedSet :

BoardConnectionData brd = 
sortedSet.tailSet(new BoardConnectionData(searchedId)).first();

Это не более эффективно по сложности, но это более короткий код. :)

0 голосов
/ 04 декабря 2011

Если класс BoardConnectionData корректно переопределяет метод equals на основе идентификатора, следующее должно сказать вам, находится объект в списке или нет:

mBoardConnections.contains(object);
0 голосов
/ 04 декабря 2011

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

0 голосов
/ 04 декабря 2011

Если вам нужно сопоставить одно свойство, и несколько элементов в списке могут иметь одинаковые значения для этого свойства, то вам нужно выполнить цикл, как вы делаете.В Java есть служебный класс Collections со множеством статических методов;для вас может иметь смысл определить свои собственные служебные методы коллекций для обработки подобных случаев.

В общем, если вы не хотите найти элемент, просто используйте indexOf иОбязательно реализуйте equals правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...