Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Ваш алгоритм корректен. Но мы можем сделать оптимизацию следующим образом: При инвертировании можно попытаться сохранить другую переменную для сокращения обратного счетчика начиная с вычислений array.length-(i+1), может занять время! И также переместите объявление временного файла снаружи так, чтобы каждый раз это не было выделено
double temp;
for(int i=0,j=array.length-1; i < (array.length/2); i++, j--) {
// swap the elements
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
Если производительность важна, и список обычно уже отсортирован вполне хорошо.
Пузырьковая сортировка должна быть одним из самых медленных способов отсортировать, но я видел случаи, где лучшая производительность была простой двунаправленной пузырьковой сортировкой.
, Таким образом, это может быть одним из нескольких случаев, где можно извлечь выгоду из кодирования его сами. Но действительно необходимо сделать его правильно (удостоверьтесь, по крайней мере, что кто-то еще подтверждает код, сделайте доказательство, что это работает и т.д.)
, Как кто-то еще указал, может быть еще лучше запуститься с сортированного массива и сохранить отсортированным при изменении содержания. Это может работать еще лучше.
Я не знаю, что любой примитив сортирует средства в API ядра Java.
От моих экспериментирований с язык программирования D (своего рода C на стероидах), я нашел, что алгоритм сортировки слиянием является возможно самым быстрым алгоритмом сортировки общего назначения вокруг (это - то, что сам язык D использует для реализации его функции вида).
Вы не можете использовать Компараторы для сортировки примитивных массивов.
Ваш лучший выбор состоит в том, чтобы реализовать (или одолжить реализацию) алгоритма сортировки, который является соответствующий , чтобы Ваш вариант использования отсортировал массив (в обратном порядке в Вашем случае).
Был некоторый беспорядок [приблизительно 111] в других ответах. Если Вы скажете
double[] arr = new double[]{6.0, 5.0, 11.0, 7.0};
List xs = Arrays.asList(arr);
System.out.println(xs.size()); // prints 1
тогда, то у Вас будет Список с 1 элементом. Получающийся Список имеет двойное [] массив как его собственный элемент. То, что Вы хотите, должно иметь List<Double>
, чьи элементы являются элементами double[]
.
, К сожалению, никакое решение, включающее Компараторы, не будет работать на примитивный массив. Arrays.sort
только принимает Компаратор, будучи переданным Object[]
. И поскольку причины описывают выше, Arrays.asList
не позволит Вам составить Список из элементов Вашего массива.
Так несмотря на мой более ранний ответ, который комментарии ниже ссылки, нет никакого лучшего пути, чем ручное инвертирование массива после сортировки. Любой другой подход (такой как копирование элементов в Double[]
и сортировка реверса и копирование их назад) был бы большим количеством кода и медленнее.
Ваша реализация (та в вопросе) быстрее, чем, например, переносящийся с toList()
и использующий основанный на компараторе метод. Автоупаковка и пробежка методов компаратора или обернутых объектов Наборов намного медленнее, чем просто инвертирование.
, Конечно, Вы могли записать свой собственный вид. Это не могло бы быть ответом, который Вы ищете, , но примечание, что, если Ваш комментарий о, "если массив уже отсортирован вполне хорошо", часто происходит, Вы могли бы преуспеть для выбора алгоритма сортировки, который обрабатывает тот случай хорошо (например, вставка), а не использует Arrays.sort()
(который является сортировкой с объединением или вставкой, если число элементов является небольшим).
double[] array = new double[1048576];
...
Согласно порядку по умолчанию возрастает
Для инвертирования порядка
Arrays.sort(array,Collections.reverseOrder());
Я думаю, что было бы лучше не перестроить колесо и использовать Arrays.sort ().
Да, я видел "убывающую" часть. Сортировка является твердой частью, и Вы хотите извлечь выгоду из простоты и скорости кода библиотеки Java. Как только это сделано, Вы просто инвертируете массив, который является относительно дешевым O (n) операция. Вот некоторый код , я нашел для выполнения в этом всего 4 строки:
for (int left=0, right=b.length-1; left<right; left++, right--) {
// exchange the first and last
int temp = b[left]; b[left] = b[right]; b[right] = temp;
}