Как получить самое маленькое значение из ArrayList в Java?
У меня есть список "ArrayList" из ста элементов "distances". Я хочу проитись по каждой десятке из них и выбрать самое маленькое значение. На пример:
ArrayList
{10,21,12,23,34,5,61,72,18,9} // min value = 5
{21,36,12,45,85,45,6,89,53,11} // min value = 6
{1,23,22,11,3,44,54,44,1,2,33} // min value = 1 ...и так до конца списка
Это должно быть методом, который возвращает по одному этому значению за раз, а не как целый список из этих маленьких значеий.
Вот что у меня пока -
// 100 elements of distances
private List<Double> xAndY;
//constructor
public Distance(List<Double> xAndY) {
this.xAndY = xAndY;
}
public double distances(Distance distance) {
//shortest distance
double minValue = 0;
for (int i = 0; i < this.xAndY.size(); i++) {
if (this.xAndY.size() < 10) {
minValue = getMin(distance.getXandY().subList(0, 9));
}
if (this.xAndY.size() > 10 && this.xAndY.size() < 20) {
minValue = getMin(distance.getXandY().subList(10, 19));
}
if (this.xAndY.size() > 20 && this.xAndY.size() < 30) {
minValue = getMin(distance.getXandY().subList(20, 29));
}
if (this.xAndY.size() > 30 && this.xAndY.size() < 40) {
minValue = getMin(distance.getXandY().subList(30, 39));
}
if (this.xAndY.size() > 40 && this.xAndY.size() < 50) {
minValue = getMin(distance.getXandY().subList(40, 49));
}
if (this.xAndY.size() > 50 && this.xAndY.size() < 60) {
minValue = getMin(distance.getXandY().subList(50, 59));
}
if (this.xAndY.size() > 60 && this.xAndY.size() < 70) {
minValue = getMin(distance.getXandY().subList(60, 69));
}
if (this.xAndY.size() > 70 && this.xAndY.size() < 80) {
minValue = getMin(distance.getXandY().subList(70, 79));
}
if (this.xAndY.size() > 80 && this.xAndY.size() < 90) {
minValue = getMin(distance.getXandY().subList(80, 89));
}
if (this.xAndY.size() > 90 && this.xAndY.size() < 100) {
minValue = getMin(distance.getXandY().subList(90, 99));
}
}
return minValue;
}
Ответы (2 шт):
Автор решения: igo
→ Ссылка
Double getMin(ArrayList<Double> list) {
return Collections.min(list);
}
создаем цикл заполняющий doublesMin с десятью минимальными значениями из каждой десятки
// тут будут 10 знач из каждой десятки
ArrayList<Double> doublesMin = new ArrayList<>();
for (int i = 0; i < 10; i++) {
doublesMin.add(getMin(doubleArrayList.subList(10 * i, i * 10 + 9)));
}
Автор решения: Drakonoved
→ Ссылка
На стримах: Берем массив из 10 элементов, открываем по нему stream, сортируем по возрастанию (natural order), берем из него первый элемент, и, если он есть (т.е. массив был не пустой), тогда выводим результат в консоль.
public static void main(String[] args) {
Integer[] arr1 = new Integer[] {10, 21, 12, 23, 34, 5, 61, 72, 18, 9};
Integer[] arr2 = new Integer[] {21, 36, 12, 45, 85, 45, 6, 89, 53, 11};
Integer[] arr3 = new Integer[] {1, 23, 22, 11, 3, 44, 54, 44, 1, 2, 33};
soutArr(arr1); // 5
soutArr(arr2); // 6
soutArr(arr3); // 1
}
private static void soutArr(Integer[] arr) {
Stream.of(arr).sorted().findFirst().ifPresent(System.out::println);
}
То же самое с листом:
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
// Заполняем лист как-то.. Например:
list.addAll(Arrays.asList(arr1));
list.addAll(Arrays.asList(arr2));
list.addAll(Arrays.asList(arr3));
soutList(list.subList(0, 9)); // 5
soutList(list.subList(10, 19)); // 6
soutList(list.subList(20, 29)); // 1
}
private static void soutList(List<Integer> list) {
list.stream().sorted().findFirst().ifPresent(System.out::println);
}