Auflösen von „UnsupportedOperationException“ beim Entfernen aus der Liste „Arrays.asList“
Im bereitgestellten Java-Code tritt die Ausnahme „UnsupportedOperationException“ auf, wenn Versuch, ein Element aus einer „Liste“ zu entfernen, die mit „Arrays.asList“ erstellt wurde. Dieses Problem hat mehrere Ursachen:
Liste fester Größe aus „Arrays.asList“
„Arrays.asList“ gibt eine „Liste“ zurück, die durch das bereitgestellte Array unterstützt wird . Diese „Liste“ hat eine feste Größe, was bedeutet, dass ihre Struktur nicht durch Hinzufügen oder Entfernen von Elementen geändert werden kann. Daher führt der Aufruf der „remove“-Methode zur „UnsupportedOperationException“.
Regex-Problem in der „split“-Methode
Die „split“-Methode mit dem angegebenen Parameter „ |" behandelt es als Metazeichen eines regulären Ausdrucks. Um ein Literal „|“ aufzuteilen, muss es als „|“ maskiert werden.
Verbesserter Algorithmus für die zufällige Elemententfernung
Um zu vermeiden, dass „remove“ mehrmals aufgerufen wird Bei Zufallsindizes besteht ein effizienterer Ansatz darin, genügend Zufallszahlen innerhalb des Bereichs zu generieren und Elemente an den entsprechenden Indizes in einem einzigen Durchgang durch die „Liste“ mithilfe eines „listIterators“ zu entfernen. Diese Optimierung reduziert die Komplexität des Algorithmus auf O(N).
Überarbeiteter Code
Um das Problem zu beheben und den verbesserten Algorithmus zu implementieren, kann der folgende Code verwendet werden :
import java.util.LinkedList; import java.util.List; import java.util.Random; public static String SelectRandomFromTemplate(String template, int count) { String[] split = template.split("\|"); List<String> list = new LinkedList<String>(Arrays.asList(split)); Random r = new Random(); int[] indicesToRemove = new int[list.size() - count]; for (int i = 0; i < indicesToRemove.length; i++) { indicesToRemove[i] = r.nextInt(list.size()); } indicesToRemove = Arrays.sort(indicesToRemove); java.util.ListIterator<String> iter = list.listIterator(); for (int i : indicesToRemove) { iter.next(); iter.remove(); } return StringUtils.join(list, ", "); }
Dieser überarbeitete Code behebt die oben genannten Probleme, verwendet eine aus einem Array erstellte „Liste“ fester Größe und implementiert einen effizienteren Algorithmus zur zufälligen Entfernung von Elementen, um diese zu vermeiden die „UnsupportedOperationException“.
Das obige ist der detaillierte Inhalt vonWarum führt das Entfernen von Elementen aus „Arrays.asList' zu einer „UnsupportedOperationException'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!