erstellen - Wie kann ich eine ArrayList aus einer ArrayList in Java herausschneiden?



java arraylist remove (3)

Wie bekomme ich ein Array Slice einer ArrayList in Java? Speziell möchte ich so etwas tun:

ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>

Also habe ich erwartet, dass das funktioniert, aber Java gibt eine List - also ist es inkompatibel. Und wenn ich es versuche, wird Java mich nicht zulassen. Ich brauche eine ArrayList - was kann ich tun?

https://src-bin.com


Answer #1

Ich habe einen Weg gefunden, wenn Sie startIndex und endIndex der Elemente kennen, die Sie aus ArrayList entfernen müssen

Sei al die ursprüngliche ArrayList und startIndex , endIndex ist der Start- und End-Index, der aus dem Array entfernt werden soll:

al.subList(startIndex, endIndex + 1).clear();

Answer #2

In Java empfiehlt es sich, Schnittstellentypen anstelle von konkreten Klassen in APIs zu verwenden.

Ihr Problem ist, dass Sie ArrayList (wahrscheinlich an vielen Stellen) verwenden, wo Sie wirklich List . Als Ergebnis haben Sie Probleme mit einer unnötigen Einschränkung erstellt, dass die Liste eine ArrayList .

So sollte Ihr Code aussehen:

List input = new ArrayList(...);

public void doSomething(List input) {
   List inputA = input.subList(0, input.size()/2);
   ...
}

this.doSomething(input);

Ihre vorgeschlagene "Lösung" für das Problem war / ist dies:

new ArrayList(input.subList(0, input.size()/2))

Das funktioniert, indem man eine Kopie der Unterliste macht. Es ist kein Schnitt im normalen Sinne. Wenn die Unterliste groß ist, wird die Erstellung der Kopie teuer.

Wenn Sie durch APIs eingeschränkt sind, die Sie nicht ändern können , sodass Sie inputA als ArrayList deklarieren inputA , können Sie möglicherweise eine benutzerdefinierte Unterklasse von ArrayList implementieren, in der die subList Methode eine Unterklasse von ArrayList zurückgibt. Jedoch:

  1. Es wäre eine Menge Arbeit zu entwerfen, zu implementieren und zu testen.
  2. Sie haben Ihrer Codebasis nun eine signifikante neue Klasse hinzugefügt, möglicherweise mit Abhängigkeiten von undokumentierten Aspekten (und daher "Änderungen unterworfen") der ArrayList Klasse.
  3. Sie müssten relevante Stellen in Ihrer Codebasis ändern, in denen Sie ArrayList Instanzen erstellen, um Instanzen Ihrer Unterklasse zu erstellen.

Die Lösung "Kopiere das Array" ist praktischer, wenn man bedenkt, dass dies keine echten Slices sind.


Answer #3

Wenn es keine existierende Methode gibt, dann denke ich, dass Sie von 0 bis input.size()/2 iterieren können, indem Sie jedes aufeinanderfolgende Element nehmen und es an eine neue ArrayList anhängen.

EDIT : Eigentlich glaube ich, Sie können diese Liste nehmen und verwenden, um eine neue ArrayList mit einem der ArrayList-Konstruktoren zu instanziieren.





arraylist