Heim > Java > javaLernprogramm > Warum führt das Entfernen von Elementen aus „Arrays.asList' zu einer „UnsupportedOperationException'?

Warum führt das Entfernen von Elementen aus „Arrays.asList' zu einer „UnsupportedOperationException'?

Patricia Arquette
Freigeben: 2024-12-22 12:17:16
Original
919 Leute haben es durchsucht

Why Does Removing Elements from `Arrays.asList` Result in an `UnsupportedOperationException`?

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, ", ");
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage