2012-05-17 5 views
7

Chcę usunąć określone elementy z mojej listy. Nie chcę tego robić podczas iteracji listy. Chcę określić wartość, którą należy usunąć. W Javadocs Znalazłem funkcję List.remove(Object 0) To jest mój kod:usuwanie wartości z listy <String> w java throws java.lang.UnsupportedOperationException

  String str="1,2,3,4,5,6,7,8,9,10"; 
     String[] stra=str.split(","); 
     List<String> a=Arrays.asList(stra); 
     a.remove("2"); 
     a.remove("3"); 

Ale otrzymuję wyjątek: java.lang.UnsupportedOperationException

Odpowiedz

22

Problem polega na tym, że Arrays.asList() zwraca listę, która nie obsługuje wstawiania/usuwania (nie jest to po prostu widok na stra).

Aby ustalić, zmiana:

List<String> a = Arrays.asList(stra); 

do:

List<String> a = new ArrayList<String>(Arrays.asList(stra)); 

ta tworzy kopię listy, dzięki czemu można go zmodyfikować.

+0

Działa. dzięki Co było nie tak z moją metodą. Lista a = Arrays.asList (stra); Wyjątek nie został zgłoszony w tej linii. – Ashwin

+0

@Ashwin: Ta linia była w porządku. Jednak lista utworzona przez 'Arrays.asList()' jest tylko do odczytu, więc nie można jej modyfikować. Najpierw musisz zrobić kopię. – NPE

+0

ok. Z moją metodą była lista, która po prostu uzyskuje dostęp do wartości ciągu [] bezpośrednio, bez tworzenia własnej kopii? Więc jeśli jakiekolwiek zmiany byłyby dozwolone, wpłynęłoby to również na String [], prawda? – Ashwin

2

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29

zobaczyć. Arrays.asList zwraca ustaloną listę. Który jest niezmienny. Przez jego definicję nie można modyfikować tego obiektu po jego utworzeniu. To dlatego wyrzuca nieobsługiwany wyjątek.

+1

Ciąg jest również niezmienny. Ale gdy modyfikujesz ciąg, zostaje mu przydzielona nowa lokalizacja pamięci i wewnętrznie tworzony jest nowy ciąg. Tak skutecznie można modyfikować niezmienny ciąg. Tak więc nie sądzę, że powodem jest to, że lista zwrócona jest niezmienna. Myślę, że to dlatego, że kiedy robisz Arrays.asList(), po prostu odwołuje się do ciągu [] (nie kopiuje ciągu [] i tworzy listę). – Ashwin

+0

Jeśli zajrzysz do wewnętrznej klasy klasy AraayList w klasie Arrays, zrozumiesz, że nie można jej modyfikować. Po prostu użyj prywatnego końcowego E [] a; to jest powód, dla którego nie możesz zmodyfikować listy powracającej. W przypadku napisu nie można modyfikować napisu po utworzeniu. Ale w klasie String API jest rozwijany w taki sposób, że będzie obsługiwał modyfikacje wewnętrznie poprzez tworzenie nowego obiektu. –

+0

Więc mówisz, że tworzy kopię ciągu [], ale deklaruje go jako ostateczny. czy mówisz, że nie odwołuje się do napisu [] i przechowuje jego własną kopię (ale jako ostateczną)? – Ashwin