Saya mencoba membalikkan array int di Jawa.
Metode ini tidak membalikkan array.
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;
}
Apa yang salah dengan itu?
Jawaban:
Untuk membalikkan array int, Anda menukar item hingga mencapai titik tengah, seperti ini:
Cara Anda melakukannya, Anda menukar setiap elemen dua kali, sehingga hasilnya sama dengan daftar awal.
sumber
validData.length / 2
bagian di luar for-loop.validData.length >> 1
. Itu setara dan lebih cepat, tetapi membingungkan banyak programmer dan setiap kompiler yang baik secara otomatis akan melakukannya.validData.length - i - 1
dan menyimpannya ke variabel.Dengan Commons.Lang , Anda cukup menggunakan
Sebagian besar waktu, lebih cepat dan lebih aman dari bug untuk bertahan dengan perpustakaan yang tersedia dengan mudah yang sudah diuji unit dan diuji oleh pengguna saat mereka menangani masalah Anda.
sumber
sumber
int
dalam hal ini) dibungkus dengan pembungkusnya masing-masing (Integer
dalam hal ini) dan dimasukkan ke dalam daftar. Anda lihat,Integer
s adalah objek. @ Tomint[]
itu berbeda denganInteger[]
. Cobalah:Integer[] array = new int[5]
. Anda akan mendapatkan kesalahan kompilasi. Inilah sebabnya mengapaArrays
kelas Java mendefinisikan banyak metode untuk bekerja dengan array primitif. Mencoba memberikan metodeint[]
ke atas akan menghasilkan sesuatu sepertiThe method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
. @Filip - algoritma di tempat menggunakan lebih sedikit memori dan berjalan lebih cepat.Arrays.asList()
tidak merujuk ke array yang asli, juga array yang dikembalikan. Itulah salah satu masalah dengan metode ini: ia menggunakan tiga kali lipat memori dan melakukan tiga kali lipat pekerjaan sebagai algoritma di tempat.int[]
argumen sebagai metode ini ( "tipe tidak kompatibel: int [] tidak dapat dikonversi ke Objek []" ).java.util.Collections.reverse()
dapat membalikkanjava.util.List
danjava.util.Arrays.asList()
mengembalikan daftar yang membungkus array spesifik yang Anda lewati, oleh karenayourArray
itu dibalik setelah doaCollections.reverse()
.Biaya hanya pembuatan satu objek-Daftar dan tidak ada perpustakaan tambahan yang diperlukan.
Solusi serupa telah disajikan dalam jawaban Tarik dan komentator mereka, tetapi saya pikir jawaban ini akan lebih ringkas dan lebih mudah diurai.
sumber
int[]
keasList(...)
tidak akan mengembalikanList<Integer>
, tetapi aList<int[]>
, mengandung satu elemen. Ada AFAICS tidak ada cara bawaan yang sederhana untuk mengonversikanint[]
keInteger[]
.Arrays.stream(arr).boxed().collect(Collectors.toList())
atauArrays.stream(arr).boxed().toArray(Integer[]::new)
Saya pikir ini sedikit lebih mudah untuk mengikuti logika algoritma jika Anda mendeklarasikan variabel eksplisit untuk melacak indeks yang Anda tukar di setiap iterasi dari loop.
Saya juga berpikir lebih mudah untuk melakukan ini dalam loop sementara.
sumber
Sudah ada banyak jawaban di sini, sebagian besar berfokus pada memodifikasi array di tempat. Tetapi demi kelengkapan, berikut adalah pendekatan lain menggunakan aliran Java untuk mempertahankan array asli dan membuat array terbalik baru:
sumber
Dengan jambu biji:
sumber
asList
metode, ia menciptakan tampilan yang langsung menulis ke array backing (primitif). Saya pikir pemilih di sini keliru berpikir bahwa ini mengembalikan daftar kotak atau sesuatu.Collections.reverse
adalah metode batal. Ini beroperasi di tempat pada kelas internal Jambu yang membungkusint[]
(Karena tidak pernah menyimpan daftar kotakInteger
, saya tidak akan menyebut kelas "daftar kotak", melainkan "Tampilan daftar array"). Tapi ya itu beroperasi melalui antarmuka melewatiInteger
objek, jadi ini akan membuat banyak objek churn dan tinju sementara seperti yang disebutkan. CobaIntStream
pustaka koleksi primitif atau di mana kinerja penting. (Trove, Koloboke, Eclipse Collections, ...)Dalam kasus Java 8 kita juga dapat menggunakan
IntStream
untuk membalikkan array bilangan bulat sebagai:sumber
Sederhana untuk loop!
sumber
start <= end
kestart < end
Ini akan membantu Anda
sumber
sumber
Inilah bagaimana saya akan menyelesaikannya secara pribadi. Alasan di balik pembuatan metode parametrized adalah untuk memungkinkan setiap array diurutkan ... bukan hanya bilangan bulat Anda.
Saya harap Anda mendapatkan sesuatu darinya.
sumber
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
hanyalah pembungkus di sekitar array, sehingga array asli dibalik.Program Anda hanya akan berfungsi
length = 0, 1
. Anda dapat mencoba :sumber
Jika bekerja dengan data yang lebih primitif (yaitu char, byte, int, dll) maka Anda dapat melakukan beberapa operasi XOR yang menyenangkan.
sumber
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
Paling efisien untuk hanya mengulangi array ke belakang.
Saya tidak yakin apakah solusi Harun melakukan ini untuk panggilan ini.
Collections.reverse(list);
Adakah yang tahu?sumber
sumber
sumber
Tidakkah melakukannya dengan cara ini jauh lebih tidak mungkin untuk kesalahan?
sumber
Solusi dengan o (n) kompleksitas waktu dan o (1) kompleksitas ruang.
sumber
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.2 cara untuk membalikkan Array.
Menggunakan Untuk loop dan menukar elemen sampai titik tengah dengan kompleksitas waktu O (n / 2).
}
Menggunakan fungsi bawaan (Collections.reverse ())
}
Output: [6, 5, 4, 3, 2, 1]
sumber
Ints
?sumber
Ada beberapa jawaban bagus di atas, tetapi ini adalah bagaimana saya melakukannya:
sumber
di bawah ini adalah program lengkap untuk dijalankan di mesin Anda.
Untuk program pada matriks menggunakan array, ini akan menjadi sumber yang bagus. Pergi melalui tautan.
sumber
Menggunakan solusi XOR untuk menghindari variabel temp kode Anda akan terlihat seperti
Lihat tautan ini untuk penjelasan yang lebih baik:
http://betterexplained.com/articles/swap-two-variables-using-xor/
sumber
sumber
Berikut ini adalah implementasi sederhana, untuk membalikkan array jenis apa pun , ditambah dukungan penuh / parsial .
Berikut adalah Unit Test yang sesuai
sumber
Inilah yang saya buat:
sumber
Ada dua cara untuk memiliki solusi untuk masalah ini:
1. Membalikkan array dalam ruang.
Langkah 1. Tukar elemen pada awal dan akhir indeks.
Langkah 2. Tambahkan indeks awal, turunkan indeks akhir.
Langkah 3. Ulangi Langkah 1 dan Langkah 2 hingga mulai indeks <indeks akhir
Untuk ini, kompleksitas waktu akan menjadi O (n) dan kompleksitas ruang akan menjadi O (1)
Kode contoh untuk membalikkan array dalam ruang adalah seperti:
2. Membalikkan array menggunakan array bantu.
Langkah 1. Buat array ukuran baru yang sama dengan array yang diberikan.
Langkah 2. Masukkan elemen ke array baru mulai dari indeks awal, dari array yang diberikan mulai dari indeks akhir.
Untuk ini, kompleksitas waktu akan menjadi O (n) dan kompleksitas ruang akan menjadi O (n)
Kode contoh untuk membalikkan array dengan array bantu adalah seperti:
Kami juga dapat menggunakan API Koleksi dari Jawa untuk melakukan ini.
API Koleksi secara internal menggunakan pendekatan membalikkan ruang yang sama.
Kode contoh untuk menggunakan API Koleksi adalah seperti:
sumber
sumber
sumber