Jak uzyskać wycinek tablicy ArrayList
w języku Java? W szczególności chcę zrobić coś takiego:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
Spodziewałem się więc, że to zadziała, ale Java zwraca List
- więc jest niezgodny. A kiedy próbuję to przesłać, Java mi na to nie pozwala. Potrzebuję ArrayList
- co mogę zrobić?
ArrayList
? Myślę, że możesz nie rozumieć, jak działają interfejsy, ponieważList
iArrayList
nie są „niekompatybilne” -ArrayList
implementująList
iList
prawdopodobnie zawierają wszystkie niezbędne metody, których potrzebujesz.ArrayList
ponieważ następnie musi wywołać za jego pomocą metodę, która akceptuje rozszerzenieArrayList
. Prawdopodobnie taka metoda jest źle zaprojektowana i należy jąList
zamiast tego zaakceptować , ale takie sytuacje mogą pojawić się nie tylko w pytaniach podczas rozmowy kwalifikacyjnej, ale w kodzie napisanym przez innych, którego nie można po prostu przejść i zmienić. Współpracownicy i biblioteki nie zawsze są idealne.Odpowiedzi:
W Javie dobrą praktyką jest używanie typów interfejsów zamiast konkretnych klas w API.
Twoim problemem jest to, że używasz
ArrayList
(prawdopodobnie w wielu miejscach) miejsca, w którym naprawdę powinieneś używaćList
. W rezultacie stworzyłeś sobie problemy z niepotrzebnym ograniczeniem, że lista jestArrayList
.Oto jak powinien wyglądać Twój kod:
List input = new ArrayList(...); public void doSomething(List input) { List inputA = input.subList(0, input.size()/2); ... } this.doSomething(input);
Twoje proponowane „rozwiązanie” problemu było następujące:
new ArrayList(input.subList(0, input.size()/2))
Działa to poprzez utworzenie kopii podlisty. To nie jest plasterek w normalnym sensie. Ponadto, jeśli podlista jest duża, wykonanie kopii będzie kosztowne.
Jeśli są ograniczane przez API, że nie można zmienić , tak że trzeba zadeklarować
inputA
jakoArrayList
, może być w stanie realizować niestandardową podklasęArrayList
, w którychsubList
metoda zwraca podklasęArrayList
. Jednak:ArrayList
klasy.ArrayList
instancje, aby zamiast tego tworzyć instancje swojej podklasy.Rozwiązanie „kopiuj tablicę” jest bardziej praktyczne… biorąc pod uwagę, że nie są to prawdziwe wycinki.
źródło
new ArrayList(input.subList(0, input.size()/2))
Znalazłem sposób, jeśli znasz startIndex i endIndex elementów, które należy usunąć z ArrayList
Pozwolić
al
być przy ArrayList istartIndex
,endIndex
być początek i wskaźnik końca być usunięte z tablicy, odpowiednio:al.subList(startIndex, endIndex + 1).clear();
źródło
Jeśli nie ma istniejącej metody, myślę, że możesz iterować od 0 do
input.size()/2
, biorąc każdy kolejny element i dołączając go do nowej ArrayList.EDYCJA : Właściwie myślę, że możesz wziąć tę Listę i użyć jej do utworzenia wystąpienia nowej ArrayList przy użyciu jednego z konstruktorów ArrayList .
źródło
Chociaż ten post jest bardzo stary. Na wypadek, gdyby ktoś tego szukał ...
Guawa ułatwia podzielenie Listy na podlisty o określonym rozmiarze
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8); List<List<Integer>> subSets = Lists.partition(intList, 3);
źródło
Tak to rozwiązałem. Zapomniałem, że podlista była bezpośrednim odniesieniem do elementów z oryginalnej listy, więc ma sens, dlaczego nie działa.
ArrayList<Integer> inputA = new ArrayList<Integer>(input.subList(0, input.size()/2));
źródło