Używam List
do przechowywania niektórych danych uzyskanych przez wywołanie metody Array.asList()
. Następnie próbuję usunąć element przy użyciu metody myList.Remove(int i)
. Ale gdy próbuję to zrobić, otrzymuję UnsupportedOperationException
. Jaki byłby tego powód? Jak mam rozwiązać ten problem?UnsupportedOperationException podczas próby usunięcia z listy zwróconej przez Array.asList
Odpowiedz
Array.asList()
okłady tablicy w interfejsie listy. Lista jest nadal wspierana przez tablicę. Tablice mają stały rozmiar - nie obsługują dodawania ani usuwania elementów, więc opakowanie również nie może działać.
Docs nie robią to tak oczywiste, jak mogą one, ale robią powiedzieć:
Zwraca listę stałym rozmiarze poparte określonej tablicy.
„Fixed-size” bit powinien być wskazówką, że nie można dodać lub usunąć elementy :)
Chociaż istnieją inne sposoby obejścia tego (inne sposoby tworzenia nowego ArrayList
z tablicy) bez dodatkowych bibliotek, osobiście polecam uzyskanie Google Collections Library (lub Guava, kiedy zostanie wydany). Możesz następnie użyć:
List<Integer> list = Lists.newArrayList(array);
Powodem, dla którego sugeruję to, jest to, że GCL jest ogólnie rzeczą dobrą i wartą użycia.
Jak wspomniano w komentarzach, zajmuje to egzemplarz tablicy; lista nie jest wspierana przez oryginalną tablicę, a zmiany w obu kolekcjach nie będą widoczne w drugiej.
Implementacja, którą otrzymasz z asList, nie implementuje pełnego interfejsu List.I przekształciłbym listę w ArrayList, a następnie dokonał na niej modyfikacji.
Zobacz http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29
Masz na myśli iteracji na tej liście i umieścić wszystkie obiekty ArrayList na początku? –
Nie, konstruktor ArrayList pobiera kolekcję jako argument, więc możesz po prostu wywołać nową ArrayList. –
To nie java.util.ArrayList
. Arrays.asList()
zwraca własną implementację List
i nie obsługuje usuwania. Można tworzyć prawdziwe ArrayList
od niego:
new java.util.ArrayList(Arrays.asList(someArray));
To bardzo mylące jak asList()
roboty, muszę przyznać.
Ponieważ otrzymujesz listę tylko do odczytu. spróbować
List newList = new ArrayList(myList);
To nie jest tylko do odczytu - to tylko ustalony rozmiar. –
Proszę przeczytać w dokumentacji API dla Arrays.asList():
Zwraca listę stałym rozmiarze poparte określonej tablicy. (Zmiany w zwracanej listy „write through” do tablicy.)
Zauważ, że Collections.remove (int) jest oznaczony w Javadocs jako „opcjonalne pracy”, czyli nie wszystkie zbiory będą go wspierać. "lista o stałym rozmiarze" oznacza, że nie możesz zmienić wielkości listy, którą zrobiłaby funkcja remove(). Więc nie jest obsługiwane.
Jeśli chcesz zmienić listę wygenerowaną przez Arrays.asList(), po prostu skopiuj ją, np. new ArrayList(Arrays.asList(...))
.
użycie
ArrayList zamiast listy
Lista ustaliła elementu size Lista może ani przedmiot dodawania ani usuń
- 1. NHibernate TooManyRowsAffectedException podczas próby usunięcia wielu obiektów.
- 2. Ostrzeżenie o pandach podczas próby usunięcia kolumny
- 3. Pętla tylko iteruje raz podczas próby usunięcia klas z elementów
- 4. gVim - Nie znaleziono wzorca:^M podczas próby usunięcia nowej linii
- 5. Jaka jest domyślna kolejność listy zwróconej przez wywołanie filtru Django?
- 6. Błąd podczas próby usunięcia klucza obcego: "BŁĄD 1025 (HY000):"
- 7. Jak uzyskać odniesienie do listy zwróconej przez grep Perla?
- 8. Nie mogę dodać elementu do listy? UnsupportedOperationException
- 9. rzuca UnsupportedOperationException
- 10. Czy PostgreSQL może wybrać z tablicy zwróconej przez funkcję?
- 11. Dostęp do tablicy zwróconej przez funkcję
- 12. DateTimeFormatter.parseLocalDate wyrzuca UnsupportedOperationException
- 13. Jak mogę dezaktywować "Ostrzeżenie: Source ID 510 nie został znaleziony podczas próby usunięcia - GLib.source_remove (self.id_event_id)"?
- 14. Obsługa częściowej lub podsumowującej listy obiektów zwróconej przez GET/modele przy użyciu danych ember
- 15. Reguła zależności próbowała wyzerować kolumnę klucza podstawowego w SQL-Alchemy podczas próby usunięcia rekordu
- 16. Yii Błąd 400 CSRF żeton nie mogły zostać zweryfikowane podczas próby usunięcia stanowisko
- 17. Lista rzucanie UnsupportedOperationException
- 18. Błąd podczas próby uruchomienia PHPUnit z PhpStorm
- 19. Dlaczego muszę synchronizować listy zwrócony przez Collections.synchronizedList
- 20. Błąd podczas próby uruchomienia pgAdmin4
- 21. Co oznacza +0000 w kontekście daty zwróconej przez API Twittera?
- 22. błędy podczas próby zainicjowania vm_args
- 23. Błąd podczas próby aktualizacji zaparzania
- 24. jest zawsze bezpiecznie używać pierwszego elementu tablicy zwróconej przez split?
- 25. C# OleDb Wyjątek "Brak wartości dla jednego lub więcej wymaganych parametrów" podczas próby usunięcia z bazy danych Access
- 26. Python błąd podczas próby uzyskania dostępu przez indeks listy - „Lista indeksów muszą być liczbami całkowitymi, nie STR”
- 27. błędy WSGIServer podczas próby uruchomienia aplikacji Django
- 28. Zawieszenie podczas próby przeniesienia UITableView wiersze
- 29. Wykonywanie wyjść z "Błąd 2" podczas próby instalacji gcc-4.8.1
- 30. g ++ błędy podczas próby skompilować C++ 11 z RCPP
+1 dla Google Guava – Snekse
Uzgodnione. Jednak myślę, że warto zauważyć, że oryginalna metoda zwraca listę, która jest wspierana przez oryginalną tablicę i zmienia "write-through" na oryginalną tablicę. Użycie tego nie zwróci listy, która jest wspierana przez oryginalną tablicę, a wszelkie zmiany w tej zwróconej liście NIE wpłyną na oryginalną tablicę. – desau
@desau: Edytowałem, aby to zaznaczyć. –