2012-04-21 15 views
13

Mam krótkie pytanie. W java mam tablicę liczb całkowitych, której długość zależy od klasy. W szczególności potrzebuję go zwiększyć o jedną w pewnych sytuacjach. Próbowałem tego w ten sposób.Jak zwiększyć długość tablicy

 sbgHeadX = new int[ numberOfSBG ]; 

Chciałbym zwiększyć liczbę całkowitą numberOfSBG, kiedy potrzebowałem, ale nie sądzę, że to działa. Czy jest jakiś inny sposób?

+0

Czy możesz podać rozsądne maksimum. Oczywiście twoja tablica nigdy nie może być większa niż Integer.MAX_VALUE, ale jeśli wiesz, że twoja tablica nie może nigdy być większa niż 300, możesz ustawić jej długość na 300. – emory

+0

@emory - osobiście, uważam, że robię to, by być silnym zapach kodu: wynikiem jest tablica, której niektóre elementy "nie powinny być używane". Jest to podatny na błędy i niezdarny styl kodowania, wymagający przekazania osobnej zmiennej z liczbą poprawnych elementów. Łamie również założenie, że '.size()' daje liczbę elementów do pracy. – ToolmakerSteve

Odpowiedz

13

Proponuję użyć ArrayList jak nie będzie trzeba się martwić o długości już. Po utworzeniu nie można zmodyfikować rozmiaru tablicy:

Tablica jest obiektem kontenerowym, który przechowuje stałą liczbę wartości jednego typu. Długość tablicy jest ustalana podczas tworzenia tablicy. Po utworzeniu jego długość jest stała.

(Source)

+0

w jaki sposób uzyskać dostęp do określonego indeksu na liście? – kullalok

+1

@ user1276078 'yourArraylist.get (2)' jest odpowiednikiem 'yourClassicArray [2]' – talnicolas

+1

Podczas gdy to działa, może to powodować niepotrzebne autoboxing, ponieważ OP wskazuje, że był to prymitywny int. Kolekcje Java wymagają obiektów jako ich wartości, więc JVM będzie konwertować wszystkie wartości na liczbę całkowitą za każdym razem, gdy wywoływana jest metoda kolekcji. Może to być kosztowne z czasem. Oczywiście, programista musi zdecydować, czy warto "napowietrzać" robienie czegoś takiego jak sugeruje Hunter McMillen, ale jego odpowiedź brzmi: IMHO, dokładniejsza odpowiedź na to pytanie. –

1

Z definicji tablice mają stały rozmiar. Zamiast tego możesz użyć tablicy, która jest tablicą "rozmiaru dynamicznego". W rzeczywistości VM "dostosowuje rozmiar" * tablicy odsłoniętej przez ArrayList.

See also

* przy użyciu tablic back-kopiowania

+3

* "W rzeczywistości VM dostosowuje rozmiar tablicy odsłoniętej przez listę array." *. Błędny. W rzeczywistości kod 'ArrayList' tworzy nową tablicę backingową i kopiuje zawartość istniejącego. Dłużności macierzy nie można zmienić ... nawet przez maszynę JVM. Byłoby to naruszenie specyfikacji języka Java. –

+1

@StephenC Masz rację. Wada Mi podczas tłumaczenia. –

+0

Wciąż masz tylko połowę racji. To nie JVM dokonuje regulacji. Klasa 'ArrayList' robi to ... w zwykłym kodzie Java. A tablica NIE jest eksponowana przez listę tablic ... jest to prywatny obiekt, który jest UKRYTY przez listę tablic. –

18

Jeśli nie chcą lub nie mogą używać ArrayList, to nie jest to metoda narzędzie:

Arrays.copyOf() 

, które pozwalają określić nowy rozmiar, przy jednoczesnym zachowaniu elementy.

+2

"Ten algorytm oferuje wydajność n * log (n) dla wielu zestawów danych, które powodują obniżenie wydajności do kwadratowej wydajności innych". –

21

Tablice w języku Java mają stały rozmiar, który jest określony, gdy są zadeklarowane. Aby zwiększyć rozmiar tablicy, musisz utworzyć nową tablicę o większym rozmiarze i skopiować wszystkie stare wartości do nowej tablicy.

ex:

char[] copyFrom = { 'a', 'b', 'c', 'd', 'e' }; 
char[] copyTo = new char[7]; 

System.out.println(Arrays.toString(copyFrom)); 
System.arraycopy(copyFrom, 0, copyTo, 0, copyFrom.length); 
System.out.println(Arrays.toString(copyTo)); 

Alternatywnie można użyć dynamicznej struktury danych jak listy.

+2

IMHO, używając 'Arrays.copyOf()', jak w odpowiedzi Jakuba, dałoby krótszy, bardziej czytelny kod. – ToolmakerSteve

0
Item[] newItemList = new Item[itemList.length+1]; 
    //for loop to go thorough the list one by one 
    for(int i=0; i< itemList.length;i++){ 
     //value is stored here in the new list from the old one 
     newItemList[i]=itemList[i]; 
    } 
    //all the values of the itemLists are stored in a bigger array named newItemList 
    itemList=newItemList; 
0

Możesz skorzystać z ArrayList. Macierz ma ustaloną liczbę wymiarów.

Ta Example tutaj może ci pomóc. Przykład jest dość prosty z jego wyjściem.

 
Output: 
2 5 1 23 14 
New length: 20
Element at Index 5:29
List size: 6
Removing element at index 2: 1
2 5 23 14 29
Powiązane problemy