Zastanawiałem się, jak zainicjować tablicę liczb całkowitych, tak aby jej rozmiar i wartości zmieniały się w trakcie wykonywania mojego programu, jakieś sugestie?
Zastanawiałem się, jak zainicjować tablicę liczb całkowitych, tak aby jej rozmiar i wartości zmieniały się w trakcie wykonywania mojego programu, jakieś sugestie?
Odpowiedzi:
Tak: użyj ArrayList .
W Javie „normalne” tablice mają stałą wielkość. Musisz nadać im rozmiar i nie możesz ich rozszerzać ani zmniejszać. Aby zmienić rozmiar, musisz utworzyć nową tablicę i skopiować żądane dane - co jest nieefektywne i uciążliwe.
Na szczęście istnieje wiele rodzajów wbudowanych klas, które implementują typowe struktury danych, a także inne przydatne narzędzia. Będziesz chciał sprawdzić API Java 6, aby uzyskać pełną ich listę.
Jedno zastrzeżenie: ArrayList może przechowywać tylko obiekty (np. Liczby całkowite), a nie prymitywy (np. Int). W WIĘKSZOŚCI przypadków autoboxing / autounboxing zajmie się tym po cichu, ale możesz uzyskać dziwne zachowanie w zależności od tego, co robisz.
size
w trakcie działania programu; dostaje taki rozmiar, jaki jest, size
kiedy ta linia jest wykonywana.
null
. Jakieś pomysły, dlaczego?
Tablice w Javie mają stały rozmiar. Potrzebujesz tablicy ArrayList, jednej z wielu niezwykle cennych kolekcji dostępnych w Javie.
Zamiast
Integer[] ints = new Integer[x]
używasz
List<Integer> ints = new ArrayList<Integer>();
Następnie, aby zmienić używaną listę ints.add(y)
i ints.remove(z)
spośród wielu innych przydatnych metod, można znaleźć w odpowiednich Javadocach.
Zdecydowanie polecam przestudiowanie klas kolekcji dostępnych w Javie, ponieważ są one bardzo potężne i zapewniają wiele wbudowanych funkcji, które nowicjusze Java zwykle próbują niepotrzebnie przepisywać.
List<Integer>
zamiast ArrayList<Integer>
?
Tablice mają stały rozmiar po utworzeniu wystąpienia. Zamiast tego możesz użyć listy.
Autoboxing sprawia, że lista staje się użyteczna jak tablica, możesz umieścić w niej po prostu wartości int:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Nie zgadzam się z poprzednimi odpowiedziami sugerującymi ArrayList
, ponieważ nieArrayList
jest to tablica dynamiczna, ale lista obsługiwana przez tablicę. Różnica polega na tym, że nie możesz wykonać następujących czynności:
ArrayList list = new ArrayList(4);
list.put(3,"Test");
Daje ci wyjątek IndexOutOfBoundsException, ponieważ nie ma jeszcze elementu w tej pozycji, mimo że tablica zapasowa pozwoliłaby na takie dodanie. Musisz więc użyć niestandardowej rozszerzalnej implementacji tablicy, takiej jak sugerowana przez @ randy-lance
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below
public class DynamicArray {
static int []increaseSizeOfArray(int []arr){
int []brr=new int[(arr.length*2)];
for (int i = 0; i < arr.length; i++) {
brr[i]=arr[i];
}
return brr;
}
public static void main(String[] args) {
int []arr=new int[5];
for (int i = 0; i < 11; i++) {
if (i<arr.length) {
arr[i]=i+100;
}
else {
arr=increaseSizeOfArray(arr);
arr[i]=i+100;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println("arr="+arr[i]);
}
}
}
Źródło: jak zrobić tablicę dynamiczną
Zaleca się używanie listy w przypadku małej skali.
Jeśli masz ogromną liczbę numerów, NIGDY nie używaj listy i autoboxingu,
Lista <liczba całkowita> lista
Dla każdego int, automatycznie tworzona jest nowa liczba całkowita. Przekonasz się, że zwalnia, gdy rozmiar listy rośnie. Te liczby całkowite są niepotrzebnymi obiektami. W takim przypadku użycie szacowanego rozmiaru byłoby lepsze,
int[] array = new int[ESTIMATED_SIZE];
Co powiesz na użycie List
zamiast tego? Na przykład,ArrayList<integer>
Nie możesz zmienić rozmiaru tablicy. Możesz jednak utworzyć nową tablicę o odpowiednim rozmiarze i skopiować dane ze starej tablicy do nowej.
Ale najlepszą opcją jest użycie IntList z jacarta commons. ( tutaj )
Działa podobnie jak List, ale zajmuje mniej miejsca i jest bardziej wydajne, ponieważ przechowuje wartości int zamiast przechowywania obiektów opakowujących nad wartościami int (tym jest klasa Integer).
Odpowiedziałem na to pytanie i nie, nie potrzebujesz arraylisty ani żadnej innej rzeczy, to było zadanie i ukończyłem je, aby tak, tablice mogły zwiększyć rozmiar. Oto link Jak używać tablicy dynamicznej Java, a tutaj jest łącze do mojego pytania, na które odpowiedziałem tablice dynamiczne Java
int[] array = new int[size];
size
jest zmienną, ale długość tablicy musi być ustalona, mam rację? @Lord Torgamus