2012-05-17 5 views
7

Ich möchte bestimmte Elemente aus meiner Liste entfernen. Ich möchte das nicht tun, während ich die Liste durchblättere. Ich möchte den Wert angeben, der gelöscht werden soll. In javadocs fand ich die Funktion List.remove(Object 0) Dies ist mein Code:Entfernen eines Wertes aus einer Liste <String> in Java wirft 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"); 

Aber ich erhalte eine Ausnahme: java.lang.UnsupportedOperationException

Antwort

22

Das Problem ist, dass Arrays.asList() eine Liste zurückgibt, die nicht Einfügen/Entfernen nicht unterstützt (es ist einfach eine Ansicht auf stra).

Um dies zu beheben, ändern:

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

zu:

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

Dieses eine Kopie der Liste macht, so dass Sie es ändern.

+0

Es funktioniert. Danke Was war mit meiner Methode nicht in Ordnung? Liste a = Arrays.asList (str); Die Ausnahme wurde nicht in dieser Zeile geworfen. – Ashwin

+0

@Ashwin: Diese Linie war in Ordnung. Die Liste, die von 'Arrays.asList()' erzeugt wird, ist jedoch schreibgeschützt, so dass Sie sie nicht ändern können. Sie müssen zuerst eine Kopie machen. – NPE

+0

okay .. mit meiner Methode war die Liste nur Zugriff auf die Zeichenfolge [] Werte direkt, ohne eine eigene Kopie zu machen? Wenn also irgendwelche Änderungen erlaubt wären, würden sie sich auch auf die String [] auswirken, oder? – Ashwin

2

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

dies sehen. Arrays.asList gibt eine feste Liste zurück. Was ist unveränderlich. Nach seiner Definition können Sie das Objekt nicht ändern, nachdem es erstellt wurde. Deshalb wird eine nicht unterstützte Ausnahme ausgelöst.

+1

Eine Zeichenfolge ist ebenfalls unveränderbar. Wenn Sie jedoch eine Zeichenfolge ändern, wird ihr ein neuer Speicherort zugewiesen, und intern wird eine neue Zeichenfolge erstellt. So können Sie eine unveränderliche Zeichenfolge effektiv ändern. Ich denke also nicht, dass die zurückgegebene Liste unveränderlich ist. Ich denke, es ist, weil, wenn Sie Arrays.asList() tun, es nur verweist auf die Zeichenfolge [] (kopiert nicht die Zeichenfolge [] und eine Liste erstellen). – Ashwin

+0

Wenn Sie einen Blick in die innere Klasse werfen, rufen Sie AraayList in der Klasse "Arrays" auf. Sie werden feststellen, dass sie nicht geändert werden kann. Einfach verwenden Sie ein privates Finale E [] a; das ist der Grund, warum Sie die Rückkehrliste nicht ändern können. Im Fall von String können Sie einen String nicht ändern, nachdem Sie ihn erstellt haben. In der String-Klasse wird die API jedoch so entwickelt, dass sie Änderungen intern durch das Erstellen eines neuen Objekts behandelt. –

+0

Sie sagen also, dass es eine Kopie der Zeichenfolge [] erstellt, aber als endgültig deklariert. meinst du, dass es nicht auf die string [] verweist und eine eigene Kopie speichert (aber als final)? – Ashwin

Verwandte Themen