Myślę, że to dość proste pytanie, ale nie mogę wymyślić, jak to zrobić poprawnie.
Mam pustego arraylistę:
ArrayList<object> list = new ArrayList<object>();
Mam kilka obiektów, które chcę dodać, a każdy z nich musi znajdować się w określonej pozycji. Konieczne jest jednak, aby można je było dodawać w każdej możliwej kolejności. Kiedy próbuję tego, nie działa i otrzymuję IndexOutOfBoundsException
:
list.add(1, object1)
list.add(3, object3)
list.add(2, object2)
Co Próbowałem wypełnia ArrayList
przy null
czym robi to powyżej. Działa, ale uważam, że to okropne rozwiązanie. Czy jest inny sposób, aby to zrobić?
Odpowiedzi:
Możesz to zrobić w ten sposób:
Po dodaniu object2 do pozycji 2 przesunie on object3 na pozycję 3.
Jeśli chcesz, aby obiekt3 był na pozycji3 przez cały czas, sugerowałbym użycie HashMap z pozycją jako kluczem i obiektem jako wartością.
źródło
Możesz użyć tablicy obiektów i przekonwertować ją na ArrayList-
ArrayList będzie wynosić- [1, null, 2, 3, null, null, null, 7, null, null]
źródło
Jeśli tak jest, to dlaczego nie rozważyć użycia zwykłej tablicy, zainicjuj pojemność i umieść obiekty w żądanym indeksie.
źródło
Możesz również zastąpić ArrayList, aby wstawić wartości null między rozmiarem a elementem, który chcesz dodać.
Następnie możesz dodać w dowolnym miejscu ArrayList. Na przykład ta główna metoda:
daje taki wynik z konsoli:
0: zero
1 jeden
2: dwa
3: brak
4: brak
5: pięć
źródło
Zwracam uwagę na
ArrayList.add
dokumentację , która mówi, że rzucaIndexOutOfBoundsException
- jeśli indeks jest poza zakresem (index < 0 || index > size()
)Sprawdź
size()
swoją listę, zanim zadzwoniszlist.add(1, object1)
źródło
list.add("element");
Musisz wypełnić puste indeksy wartościami null.
źródło
podczas próby dodania elementu na określonej pozycji otrzymałeś IndexOutOfBound, więc lista powinna zawierać elementy na swoich pozycjach.
Spróbuj śledzić
źródło
A co z tą małą
while
pętlą jako rozwiązaniem?źródło
To jest możliwe rozwiązanie:
źródło
Myślę, że rozwiązanie od Medopal jest tym, czego szukasz.
Ale innym alternatywnym rozwiązaniem jest użycie HashMap i użycie klucza (Integer) do przechowywania pozycji.
W ten sposób nie będziesz musiał początkowo wypełniać go wartościami zerowymi itp., Po prostu przyklejaj pozycję i obiekt na mapie, gdy idziesz. Możesz napisać kilka wierszy na końcu, aby przekonwertować je na listę, jeśli potrzebujesz tego w ten sposób.
źródło
Załóżmy, że chcesz dodać element na pozycji, a wtedy rozmiar listy musi być większy niż pozycja.
add(2, item)
: ta składnia oznacza, przenieś stary element na pozycję 2 do następnego indeksu i dodaj element na drugiej pozycji.Jeśli nie ma elementu na drugiej pozycji, to nie zadziała, zgłosi wyjątek.
To znaczy, jeśli chcesz coś dodać
position 2,
Twój rozmiar listy musi wynosić co najmniej,
(2 + 1) =3,
aby pozycje były dostępne pod adresem0,1,2 Position.
w ten sposób zapewniony jest bezpieczny dostęp do pozycji 2 i nie byłoby wyjątku.
źródło
Jeśli korzystasz z wersji Java w systemie Android, mogę zasugerować użycie SparseArray . Jest to bardziej wydajne pod względem pamięci mapowanie liczb całkowitych na obiekty i łatwiejsze do iteracji niż mapa
źródło
Trochę późno, ale mam nadzieję, że nadal komuś się przyda.
2 kroki, aby dodać elementy do określonej pozycji w pliku
ArrayList
add
null elementy do określonego indeksu w plikuArrayList
Następnie
set
pozycje w razie potrzeby.W ten sposób nie masz zbędnych elementów w
ArrayList
np. Gdybyś miał dodać elementy takie jak,Nie spowodowałoby to zastąpienia istniejących elementów w tej pozycji, po prostu przesunięcia istniejących elementów w prawo o jeden - więc masz ArrayList z dwukrotnie większą liczbą wskazań.
źródło
Należy ustawić zamiast dodawać, aby zastąpić istniejącą wartość w indeksie.
Lista będzie zawierać [obiekt1, obiekt2]
źródło