Próbuję iterować nad ArrayList i chcesz znaleźć element. W liście tysiące przedmiotów jest tam, aby znaleźć wiele czasu na znalezienie. Czy ktoś może sugerować wydajne i szybkie wyszukiwanie. Kod jest poniżej:

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;
}
0
Null Pointer 4 czerwiec 2018, 10:14

3 odpowiedzi

Najlepsza odpowiedź

Jak już wspomniano @eran w komentarzach. Korzystanie z Map może być najlepszą opcją, dotyczącą wyszukiwania w górę z Id.

Do konwersji z {x0}} do Map możesz skorzystać z API strumienia Java 8:

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

Uwaga: należy to zrobić raz, a nie dla każdego wyszukiwania.

A następnie z wyszukiwaniem:

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
}
1
Lino 4 czerwiec 2018, 07:40

Jeśli chcesz mieć listę, prawdopodobnie chcesz zamówić na czas wkładania (w zależności od tego, ile wkładek VS występuje, ponieważ zamówiony wkładka jest oczywiście wolniejszy), a następnie wykonać kilka poszukiwania binarnego.

Lub nawet lepiej, użyj hashmap, jeśli nie potrzebujesz listy (lub nawet, linkedHashmap, jeśli potrzebujesz przewidywalnej kolejności).

0
BiS 4 czerwiec 2018, 07:18

Prawdopodobnie pomoże strumień równoległy

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

Powraca Optional<FoodItem>

0
Lino 4 czerwiec 2018, 07:48