Я пытаюсь изменить массив int в Java.
Этот метод не переворачивает массив.
for(int i = 0; i < validData.length; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
Что с этим не так?
Ответы:
Чтобы перевернуть массив int, вы меняете элементы вверх, пока не достигнете средней точки, например:
То, как вы это делаете, вы меняете местами каждый элемент дважды, поэтому результат совпадает с исходным списком.
источник
validData.length / 2
часть на внешней стороне цикла.validData.length >> 1
. Это эквивалентно и быстрее, но это сбивает с толку многих программистов, и любой хороший компилятор сделает это автоматически.validData.length - i - 1
и сохранить его в переменной.С Commons.Lang вы можете просто использовать
В большинстве случаев быстрее и безопаснее придерживаться легко доступных библиотек, уже проверенных модулем и проверенных пользователем, когда они решают вашу проблему.
источник
источник
int
в данном случае) упакованы в соответствующие оболочки (Integer
в данном случае) и помещены в список. Вы видите,Integer
это объекты. @Tomint[]
отличается отInteger[]
. Попробуйте:Integer[] array = new int[5]
. Вы получите ошибку компиляции. Вот почемуArrays
класс Java определяет набор методов для работы с примитивными массивами. Попытка передатьint[]
вышеупомянутый метод приведет к чему-то вродеThe method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
. @Filip - алгоритм на месте использует меньше памяти и работает быстрее.Arrays.asList()
не ссылается на исходный массив и не возвращает массив. Это одна из проблем этого метода: он использует тройную память и выполняет тройную работу как алгоритм на месте.int[]
в качестве аргумента ( «несовместимые типы: int [] нельзя преобразовать в Object []» ).java.util.Collections.reverse()
может перевернутьjava.util.List
s иjava.util.Arrays.asList()
вернуть список, который оборачивает определенный массив, который вы передаете ему, поэтомуyourArray
переворачивается после вызоваCollections.reverse()
.Стоимость всего лишь создания одного объекта List, дополнительные библиотеки не требуются.
Подобное решение было представлено в ответе Тарика и его комментаторов, но я думаю, что этот ответ был бы более кратким и более простым для анализа.
источник
int[]
toasList(...)
не будет возвращать aList<Integer>
, но aList<int[]>
, содержащий один элемент. Существует AFAICS нет простой встроенный способ конвертироватьint[]
вInteger[]
.Arrays.stream(arr).boxed().collect(Collectors.toList())
илиArrays.stream(arr).boxed().toArray(Integer[]::new)
Я думаю, что немного проще следовать логике алгоритма, если вы объявляете явные переменные для отслеживания индексов, которые вы меняете на каждой итерации цикла.
Я также думаю, что это легче сделать в цикле while.
источник
Здесь уже есть много ответов, в основном направленных на изменение массива на месте. Но для полноты картины, есть другой подход, использующий потоки Java для сохранения исходного массива и создания нового обращенного массива:
источник
С гуавой:
источник
asList
методы, он создает представление, которое записывает непосредственно в резервный (примитивный) массив. Я думаю, что избиратель здесь ошибочно думал, что это вернуло коробочный список или кое-что.Collections.reverse
является пустым методом. Это работает на месте во внутреннем классе Guava, который упаковываетint[]
(поскольку он никогда не хранит список в штучной упаковке,Integer
я бы не назвал этот класс «коробочным списком», а скорее «представлением списка массива»). Но да, он работает через интерфейс, пропускающийInteger
объекты, поэтому, как уже упоминалось, это создаст много временных откатов и коробок объектов. ПопробуйтеIntStream
библиотеку или коллекцию примитивов, где важна производительность. (Trove, Koloboke, Eclipse Collections, ...)В случае Java 8 мы также можем использовать
IntStream
для обращения к массиву целых чисел:источник
Просто для цикла!
источник
start <= end
наstart < end
Это поможет вам
источник
источник
Вот как бы я лично решил это. Причиной создания параметризованного метода является возможность сортировки любого массива, а не только целых чисел.
Я надеюсь, что вы что-то почерпнули из этого.
источник
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
это просто обертка вокруг массива, поэтому исходный массив перевернут.Ваша программа будет работать только для
length = 0, 1
. Можешь попробовать :источник
Если вы работаете с более примитивными данными (например, char, byte, int и т. Д.), Вы можете сделать несколько забавных операций XOR.
источник
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
Наиболее эффективно просто перебирать массив в обратном направлении.
Я не уверен, что решение Аарона делает этот vi этот вызов
Collections.reverse(list);
Кто-нибудь знает?источник
источник
источник
Разве это не будет намного менее вероятно для ошибок?
источник
Решение с o (n) временной сложностью и o (1) пространственной сложностью.
источник
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.2 способа перевернуть массив.
Используя цикл For и меняйте элементы до средней точки с временной сложностью O (n / 2).
}
Использование встроенной функции (Collections.reverse ())
}
Выход: [6, 5, 4, 3, 2, 1]
источник
Ints
?источник
Есть несколько отличных ответов выше, но вот как я это сделал:
источник
ниже приведена полная программа для запуска на вашем компьютере.
Для программ на матрице, использующих массивы, это будет хорошим источником. Перейдите по ссылке.
источник
Используя решение XOR, чтобы избежать временной переменной, ваш код должен выглядеть
Смотрите эту ссылку для лучшего объяснения:
http://betterexplained.com/articles/swap-two-variables-using-xor/
источник
источник
Вот простая реализация обратного массива любого типа плюс полная / частичная поддержка.
Вот соответствующий юнит тест
источник
Вот что я придумала:
источник
Есть два способа решения проблемы:
1. Обратный массив в пространстве.
Шаг 1. Поменяйте местами элементы в начале и конце индекса.
Шаг 2. Увеличьте начальный индекс, уменьшите конечный индекс.
Шаг 3. Итерируйте Шаг 1 и Шаг 2, пока начальный индекс <конечный индекс
Для этого сложность времени будет O (n), а сложность пространства будет O (1)
Пример кода для обращения массива в пространстве:
2. Обратный массив, используя вспомогательный массив.
Шаг 1. Создайте новый массив размером, равным данному массиву.
Шаг 2. Вставьте элементы в новый массив, начиная с начального индекса, с данного массива, начиная с конечного индекса.
Для этого сложность времени будет O (n), а сложность пространства будет O (n).
Пример кода для обращения массива со вспомогательным массивом выглядит так:
Также мы можем использовать API Коллекций из Java для этого.
API коллекций внутренне использует тот же самый обратный подход в пространстве.
Пример кода для использования Collections API выглядит следующим образом:
источник
источник
источник