Самый эффективный и быстрый поиск по списку массивов - PullRequest
0 голосов
/ 04 июня 2018

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

private FoodItem getFoodItem(List<FoodItem> foodItemList, String foodItemId) {
    if (foodItemId == null || foodItemList == null || foodItemList.isEmpty()) {
        return null;
    }
    for (FoodItem foodItem : foodItemList) {
        if (foodItem == null) {
            continue;
        }
        if (foodItem.getId().equals(foodItemId)) {
            return foodItem;
        }
    }
    return null;
}

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Возможно, параллельный поток поможет

foodItemList.parallelStream().findAny(foodItem->foodItem.getId().equals(foodItemId))

Возвращает Optional<FoodItem>

0 голосов
/ 04 июня 2018

Как уже упоминалось @Eran в комментариях.Использование Map может быть лучшим вариантом с точки зрения поиска с Id.

. Для преобразования из List в Map вы можете использовать Java8 Stream API:

Map<String, FoodItem> map = foodList.stream()
    .collect(Collectors.toMap(FoodList::getId, Function.identity());

Примечание: это нужно сделать один раз, а не для каждого поиска.

И затем с поиском:

public FoodItem getFoodItem(Map<String, FoodItem> map, String foodItemId){
    if (foodItemId == null || foodItemList == null || foodItemList.isEmpty()) {
        return null;
    }
    return map.get(foodItemId); // returns null if it doesn't exists
}
0 голосов
/ 04 июня 2018

Если вам НУЖНО иметь список, вы, вероятно, хотите, чтобы он был упорядочен по времени вставки (в зависимости от того, сколько операций вставки или поиска вы выполняете, потому что упорядоченная вставка медленнее, конечно), а затем выполните некоторый двоичный поиск.

Или, что еще лучше, используйте HashMap, если вам не нужен список (или даже LinkedHashMap, если вам нужен предсказуемый порядок).

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