У меня была та же проблема, это моя небольшая программа для тестирования решения. Это выглядит довольно просто, поэтому я решил поделиться им с будущими посетителями.
#include <stdio.h>
int add(int a, int b) {
return a+b;
}
int minus(int a, int b) {
return a-b;
}
int multiply(int a, int b) {
return a*b;
}
typedef int (*f)(int, int); //declare typdef
f func[3] = {&add, &minus, &multiply}; //make array func of type f,
//the pointer to a function
int main() {
int i;
for (i = 0; i < 3; ++i) printf("%d\n", func[i](5, 4));
return 0;
}
Если вы выполняете короткий код без цикла и если ваш уровень API достаточно высок:
ArrayList<ArrayListModel> filteredList = new ArrayList<>(modelList);
filteredList.removeIf(m -> ! aList.contains(m.getId()));
Сначала он копирует исходный список, а затем удаляет из копии элементы, чей идентификатор не в aList
. Не ошибайтесь, конечно, в реализации removeIf
есть цикл (по-настоящему три цикла).
Если вы опасаетесь, что может потребоваться слишком много времени для выполнения с большим количеством данных : Подождите. Не оптимизируйте, прежде чем вы убедитесь, что это необходимо. Если вы беспокоитесь, проводите тесты на реальных объемах данных на компьютере, родственном вашему компьютеру с нагрузкой, аналогичной ожидаемой.
Если вы либо видели на производстве, либо в своих тестах, что выше занимает слишком много времени, первый прием заключается в том, чтобы поместить идентификаторы либо в HashSet
, либо в BitSet
, чтобы ускорить поиск. Например:
Set<Integer> ids = new HashSet<>(aList);
ArrayList<ArrayListModel> filteredList = new ArrayList<>(modelList);
filteredList.removeIf(m -> ! ids.contains(m.getId()));
Если вам нужно дополнительное ускорение, сортируйте оба списка по ID и используйте алгоритм слияния. Посмотрите, что это такое.
На настольном компьютере вы также можете получить ускорение от потока API и параллельных потоков. Является ли это также на устройстве Android, которое я не знаю.