У меня есть массив:
LocalDateTime[] onTimes
Я хотел бы найти эффективный способ (без итерации) найти минимальное значение LocalDateTime.
Есть ли быстрый способ сделать это?
Я думаю, что вы пытаетесь решить неразрешимую проблему в информатике... если у вас есть несортированный массив с N элементами, вы должны проверить все N элементов, чтобы решить, какое минимальное значение. Вы можете минимизировать эту операцию, используя всевозможные структуры данных и/или сортировки в зависимости от ваших потребностей.
Collections.min(Arrays.asList(onTimes))
. Выдает исключение, если массив имеет длину 0 или содержит null
, поэтому сначала следует убедиться, что это не так.
Возможно, вы могли бы использовать рекурсию; но я бы не рекомендовал это для производительности. Лучший способ, который я могу придумать, - это использовать потоки API, например
LocalDateTime min = Arrays.stream(onTimes).min(Comparator.naturalOrder())
.orElseThrow();
Примечание. Это по-прежнему выполняет внутреннюю итерацию всех элементов, чтобы найти минимум.
Для полноты картины; сделать это без итерации, как я уже сказал, можно было бы сделать рекурсивно.
public static LocalDateTime getMinimum(LocalDateTime[] onTimes) {
return getMinimum(onTimes, 0);
}
private static LocalDateTime getMinimum(LocalDateTime[] onTimes, int i) {
if (i + 1 < onTimes.length) {
return min(onTimes[i], getMinimum(onTimes, i + 1));
} else {
return onTimes[i];
}
}
private static LocalDateTime min(LocalDateTime a, LocalDateTime b) {
if (a.compareTo(b) <= 0) {
return a;
}
return b;
}
Обратите внимание, что это также проверяет все элементы и, по сути, просто скрывает итерацию.
Хммм, потоки — это то, что мне нужно изучить немного больше. Хотя он «скрывает» итерацию, он выглядит чертовски лучше!
@ElliottFrisch, что такое компаратор?
@JoshuaCastelino java.util.Comparator.
Если вы хотите получить минимальный элемент несортированного массива, вам нужно проверить каждый элемент. Если вам нужно сделать это быстрее, используйте другую структуру данных (минимальную кучу, дерево и т. д.), чтобы убедиться, что массив отсортирован.