Próbuję odwrócić tablicę int w Javie.
Ta metoda nie odwraca tablicy.
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;
}
Co jest z tym nie tak?
Odpowiedzi:
Aby odwrócić tablicę int, zamieniasz elementy aż do osiągnięcia punktu środkowego, w ten sposób:
Sposób, w jaki to robisz, zamieniasz każdy element dwa razy, więc wynik jest taki sam jak początkowa lista.
źródło
validData.length / 2
część na zewnątrz pętli for.validData.length >> 1
. Jest to równoważne i szybsze, ale dezorientuje wielu programistów i każdy dobry kompilator zrobi to automatycznie.validData.length - i - 1
i zapisać je w zmiennej.Dzięki Commons.Lang możesz po prostu użyć
W większości przypadków szybsze i bezpieczniejsze jest trzymanie się łatwo dostępnych bibliotek, które są już testowane jednostkowo i testowane przez użytkownika, gdy zajmują się Twoim problemem.
źródło
źródło
int
w tym przypadku) są zawijane w odpowiednie opakowania (Integer
w tym przypadku) i umieszczane na liście. Widzisz,Integer
s są obiektami. @Tomint[]
różni się odInteger[]
. Wypróbuj:Integer[] array = new int[5]
. Otrzymasz błąd kompilacji. DlategoArrays
klasa Java definiuje wiele metod pracy z pierwotnymi tablicami. Próba przekazaniaint[]
do powyższej metody da w wyniku coś takiegoThe method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
. @Filip - algorytm lokalny zużywa mniej pamięci i działa szybciej.Arrays.asList()
nie odwołuje się do oryginalnej tablicy, a tablica nie jest zwracana. To jeden z problemów związanych z tą metodą: wykorzystuje potrójną pamięć i potroi pracę jako algorytm lokalny.int[]
argumentu jako argumentu ( „typy niezgodne: int [] nie mogą zostać przekonwertowane na Object []” ).java.util.Collections.reverse()
może odwrócićjava.util.List
s ijava.util.Arrays.asList()
zwraca listę, która otacza określoną tablicę, którą mu przekazujesz, dlategoyourArray
jest odwrócona po wywołaniuCollections.reverse()
.Koszt to tylko utworzenie jednego obiektu listy i nie są wymagane żadne dodatkowe biblioteki.
Podobne rozwiązanie zostało przedstawione w odpowiedzi Tarika i ich komentatorów, ale myślę, że ta odpowiedź byłaby bardziej zwięzła i łatwiejsza do przeanalizowania.
źródło
int[]
doasList(...)
nie zwróci aList<Integer>
, ale aList<int[]>
, zawierającego jeden element. AFAICS nie ma prostego, wbudowanego sposobu konwersjiint[]
anInteger[]
.Arrays.stream(arr).boxed().collect(Collectors.toList())
lubArrays.stream(arr).boxed().toArray(Integer[]::new)
Myślę, że nieco łatwiej jest podążać za logiką algorytmu, jeśli deklarujesz zmienne jawne, aby śledzić indeksy, które zamieniasz przy każdej iteracji pętli.
Myślę też, że łatwiej jest to zrobić w pętli while.
źródło
Jest tu już wiele odpowiedzi, głównie skoncentrowanych na modyfikacji tablicy w miejscu. Ale ze względu na kompletność, oto inne podejście wykorzystujące strumienie Java do zachowania oryginalnej tablicy i utworzenia nowej tablicy odwróconej:
źródło
Z Guava:
źródło
asList
metody, tworzy widok, który zapisuje bezpośrednio do podkładowej (pierwotnej) tablicy. Wydaje mi się, że głosujący w wyborach wyborczych omyłkowo pomyślał, że to zwróciło listę pudełkową lub coś takiego.Collections.reverse
jest nieważną metodą. Działa to w miejscu na wewnętrznej klasie Guava, która otaczaint[]
(Ponieważ nigdy nie przechowuje listy pudełekInteger
, nie nazwałbym tej klasy „listą pudełkową”, a raczej „Widok listy tablicy”). Ale tak, działa poprzez interfejs przekazującyInteger
obiekty, więc spowodowałoby to wiele tymczasowych rezygnacji i boksowania obiektów, jak wspomniano. WypróbujIntStream
bibliotekę lub prymitywną bibliotekę, w której liczy się wydajność. (Trove, Koloboke, Eclipse Collections, ...)W przypadku Java 8 możemy również użyć
IntStream
do odwrócenia tablicy liczb całkowitych, takich jak:źródło
Prosty w pętli!
źródło
start <= end
nastart < end
To ci pomoże
źródło
źródło
Tak osobiście bym to rozwiązał. Powodem stworzenia sparametryzowanej metody jest umożliwienie sortowania dowolnej tablicy ... nie tylko liczb całkowitych.
Mam nadzieję, że coś z tego wyciągniesz.
źródło
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
jest tylko otoczką tablicy, więc oryginalna tablica jest odwrócona.Twój program będzie działał tylko
length = 0, 1
. Możesz spróbować :źródło
Jeśli pracujesz z danymi, które są bardziej prymitywne (np. Char, bajt, int itp.), Możesz wykonać zabawne operacje XOR.
źródło
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
Najbardziej wydajne jest po prostu iterowanie tablicy do tyłu.
Nie jestem pewien, czy rozwiązanie Aarona to to połączenie.
Collections.reverse(list);
Czy ktoś wie?źródło
źródło
źródło
Czy zrobienie tego w ten sposób nie byłoby znacznie bardziej prawdopodobne w przypadku błędów?
źródło
Rozwiązanie o złożoności czasowej o (n) i złożoności przestrzennej o (1).
źródło
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.2 sposoby odwrócenia tablicy.
Używając pętli For i zamieniaj elementy do punktu środkowego ze złożonością czasową O (n / 2).
}
Korzystanie z wbudowanej funkcji (Collections.reverse ())
}
Wyjście: [6, 5, 4, 3, 2, 1]
źródło
Ints
?źródło
Istnieje kilka świetnych odpowiedzi powyżej, ale tak to zrobiłem:
źródło
poniżej znajduje się kompletny program do uruchomienia na twoim komputerze.
Dla programów wykorzystujących tablice na macierzy będzie to dobre źródło. Przejdź przez link.
źródło
Korzystanie z rozwiązania XOR w celu uniknięcia zmiennej temp powinien wyglądać kod
Zobacz ten link, aby uzyskać lepsze wyjaśnienie:
http://betterexplained.com/articles/swap-two-variables-using-xor/
źródło
źródło
Oto prosta implementacja odwracania tablicy dowolnego typu oraz pełna / częściowa obsługa.
Oto odpowiedni test jednostkowy
źródło
Oto, co wymyśliłem:
źródło
Istnieją dwa sposoby rozwiązania problemu:
1. Odwróć tablicę w przestrzeni.
Krok 1. Zamień elementy na początku i na końcu indeksu.
Krok 2. Zwiększ indeks początkowy, zmniejsz indeks końcowy.
Krok 3. Powtarzaj krok 1 i krok 2, aż do początku indeksu <koniec indeksu
W tym celu złożoność czasu wyniesie O (n), a złożoność przestrzeni wyniesie O (1)
Przykładowy kod do odwrócenia tablicy w przestrzeni wygląda następująco:
2. Odwróć tablicę za pomocą tablicy pomocniczej.
Krok 1. Utwórz nową tablicę o rozmiarze równym podanej tablicy.
Krok 2. Wstaw elementy do nowej tablicy, zaczynając od indeksu początkowego, od podanej tablicy, zaczynając od indeksu końcowego.
W tym celu złożoność czasu będzie wynosić O (n), a złożoność przestrzeni będzie wynosić O (n)
Przykładowy kod do odwracania tablicy za pomocą tablicy pomocniczej wygląda następująco:
W tym celu możemy również użyć interfejsu API kolekcji Java.
Interfejs API kolekcji korzysta wewnętrznie z tego samego podejścia odwrotnego w przestrzeni.
Przykładowy kod do korzystania z interfejsu API kolekcji wygląda następująco:
źródło
źródło
źródło