Существует ArrayList, который хранит целочисленные значения. Мне нужно найти максимальное значение в этом списке. Например, предположим, что сохраненные значения arrayList: 10, 20, 30, 40, 50
и максимальное значение будет 50
.
Какой эффективный способ найти максимальное значение?
@ Редактировать: я только что нашел одно решение, в котором я не очень уверен
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(100); /* add(200), add(250) add(350) add(150) add(450)*/
Integer i = Collections.max(arrayList)
и это возвращает самое высокое значение.
Другой способ сравнить каждое значение, например selection sort or binary sort algorithm
null
значения: stackoverflow.com/questions/369383/…Ответы:
Вы можете использовать
Collections API
для достижения того, что вы хотите легко - читать эффективно - достаточно Javadoc для Collections.maxисточник
O(n log(n))
но если «Не существует особенно эффективного способа», что вы предлагаете, что является лучшим решением, кроме проверки их всех?Этому вопросу уже почти год, но я обнаружил, что если вы создаете собственный компаратор для объектов, вы можете использовать Collections.max для списка массивов объектов.
источник
Насколько я понимаю, это в основном то, что делает Collections.max (), хотя они используют компаратор, поскольку списки являются общими.
источник
Мы можем просто использовать
Collections.max()
иCollections.min()
метод.источник
Класс Integer реализует Comparable, поэтому мы можем легко получить максимальное или минимальное значение списка Integer.
Если класс не реализует Comparable, и нам нужно найти максимальное и минимальное значение, мы должны написать свой собственный Comparator.
источник
Comparator.comparing
В Java 8 коллекции были улучшены за счет использования лямбда. Таким образом, найти max и min можно следующим образом, используя
Comparator.comparing
:Код:
Вывод:
источник
Нет особенно эффективного способа найти максимальное значение в несортированном списке - вам просто нужно проверить их все и вернуть максимальное значение.
источник
i = Collections.max(arrayList)
. он возвращает наивысшее значение в моем случае, не очень ли я уверен. что вы говорите?Вот еще три способа найти максимальное значение в списке с помощью потоков:
Все эти методы, как и все
Collections.max
, перебирают всю коллекцию, поэтому для них требуется время, пропорциональное размеру коллекции.источник
Java 8
Поскольку целые числа сопоставимы, мы можем использовать следующий лайнер:
Еще один момент, следует отметить, что мы не можем использовать
Funtion.identity()
вместо ,i->i
какmapToInt
предпологает ,ToIntFunction
который является совершенно другим интерфейсом и не связанный сFunction
. Более того, в этом интерфейсе есть только один метод,applyAsInt
а неidentity()
метод.источник
Вот функция
источник
источник
В дополнение к ответу gotomanners , если кто-то еще пришел сюда в поисках нулевого безопасного решения той же проблемы, это то, что я получил
источник
В Java8
источник
источник
в зависимости от размера вашего массива многопоточное решение также может ускорить работу
источник