2013-09-02 5 views
6

Jak pokazano na obrazku, po pewnym czasie uruchomić metodę, chcę usunąć stare przedmioty i przygotować do następnej kalkulacji czasu, ale zastanawiam się, jak usunąć elementy w arraylist start ze wskazanego indeksu, podobnie jak kolejka, przestrzegaj algorytmu FIFO? q1Jak usunąć elementy z listy na liście startowej ze wskazanego indeksu

+0

@Katona :) idę żeby to przeczytać, nadzieje mogą znaleźć rozwiązanie – atom2ueki

+0

w międzyczasie udało mi się sfabrykować krótką odpowiedź również – Katona

Odpowiedz

11

Można użyć List#subList(int, int):

List<Integer> list = ... 
list = list.subList(10, list.size()); // creates a new list from the old starting from the 10th element 

lub od subList tworzy widok na której każda zmiana wpływa na oryginalne listy, może to być nawet lepiej:

List<Integer> list = ... 
list.subList(0, 10).clear(); // clears the first 10 elements of list 
+0

Kiedy używam "purchase = (ArrayList ) purchase.subList (index, purchase.size());" daje mi wyjątek error..java.lang.ClassCastException: java.util.RandomAccessSubList nie można przesłać do java.util.ArrayList – atom2ueki

+0

Logika jest poprawna, ale po prostu przyjdź z błędem – atom2ueki

+0

@ atom2ueki nie używaj 'ArrayList' jako typu zmienna, użyj 'List' tak jak to zrobiłem z' list' w mojej odpowiedzi – Katona

1

Po prostu użyj do tego metody remove().

Załóżmy, że chcesz usunąć elementy z indeksami od 20 do 30 z ArrayList:

ArrayList<String> list = ... 
for (int i = 0; i < 10; i++) { // 30 - 20 = 10 
    list.remove(20); 
} 

Gdy pierwszy element o indeksie 20 usuwa elementowi 21 przenosi się do indeksu 20. Musisz usunąć 10-krotnie element z indeksu 20, aby usunąć kolejne 10 elementów.

+0

twoja metoda wydaje się tylko usunąć 20. element – atom2ueki

+0

Czy przeczytałeś zdanie poniżej kodu? Na liście tablic nie ma "dziur". Jeśli usuniesz element o indeksie 20, następny element zostanie przeniesiony do tego indeksu. – micha

+0

Myślę, że łatwiej byłoby nie być w stanie, jeśli pętla wstecz od 30 do 20. I użyj 'list.remove (i)' – mike

0

Ponieważ nie piszesz aplikacji o wysokiej wydajności, złym stylem jest przechowywanie tak dużej ilości semantyki w zmiennej indeksowej.

Lepszym rozwiązaniem byłoby użycie mapy.

E. g. Map<Item, Integer> itemStock i Map<Item, Double> prices. Wtedy też nie miałbyś żadnych problemów z operacją usuwania.

+0

, ale jeśli korzystasz z mapy, nadal potrzebuję identyfikatora dla każdej mapy, czy ma taką samą listę tutaj? przepraszam, nie rozumiem, co masz na myśli. – atom2ueki

+1

Mapy nie działają z indeksami, działają z kluczami. Klucze są obiektami, to jest to, co można zrobić w OOP, łatwiej jest zachować kod z identyfikatorami niż utrzymywać kody, w których liczby całkowite mają znaczenie wykraczające poza samą liczbę. Powinieneś napisać klasę "Przedmiot" lub coś takiego. w ten sposób i użyć go jako klucza do mapy. – mike

Powiązane problemy