Tab.length jedno, a size() drugie...

0

Cześć, chcę powiększyć tablicę w chwili kiedy zapełni się ona w 80%. Problem polega na tym, że kiedy ją powiększam teoretycznie wszystko jest ok ale nie do końca:
-ustawiam konstruktorem rozmiar tablicy (na początku na 10 elementów):

public TabStack(int sizeTab){
        tab = new Student[sizeTab];
    } 
  • funkcja size() wygląda tak:
 
public int size(){
        return tab.length;
    }

Teraz powiększam tablicę:

if (firstFree>=(double)0.8*tab.length){
            Student tab2[] = new Student[size()];
            System.arraycopy(tab,0,tab2,0,tab.length);
            Student tab[] = new Student[size()+size()/2];
            firstFree=0;
            for(int i=0; i<tab2.length*0.8;i++){//przepisuje do nowej tablicy  
                tab[i] = tab2[i];                     
                firstFree++;
            }
            System.out.println("Rozmiar tablicy po powiększeniu: "+tab.length);
            System.out.println("size "+size()); 

I teraz po powiększeniu o połowę, tab.length zwraca rozmiar 15, natomiast size() zwraca dalej 10. Dlaczego tak się dzieje?

EDIT: W zasadzie to po kolejnej iteracji pętli tab.length zwraca już 10. Czyli nie w ten sposób powinienem rozszerzyć tablicę?

Student tab[] = new Student[size()+size()/2]; 

EDIT2: Dobra mam już, zamiast

Student tab[] = new Student[size()+size()/2]; 

to

tab = new Student[size()+size()/2]; 

:D

0

chcę powiększyć tablicę w chwili kiedy zapełni się ona w 80%

I po co ci te 20% zmarnowanego miejsca? Powiększaj gdy jest zapełniona w 100%.

0

Żeby zawsze było miejsce gdzie można dorzuć parę elementów :)

0
  1. Jak dla mnie smrodek przy inkrementacji: http://4programmers.net/Forum/1101404
  2. (double)0.8 nie trzeba konwertować 0.8 na double - bo jest właśnie tego typu
  3. Zamiast: if (firstFree>=(double)0.8*tab.length) radzę: if(1.25*firstFree>=tab.length) // 1.25==1/0.8
  4. Po kiego dwa razy kopiować skoro możesz to zrobić tylko raz:
Student cpy[] = tab;
tab = new Student[size()+size()/2];
System.arraycopy(cpy,0,tab,0,cpy.length);
// firstFree=cpy.length; przecież się nie zmienił firstFree ale jeżeli już nie musisz go powiększać przez ++
  1. Powyższa zamiana naprawi problem, ale w twoim kodzie problem jest tu: i<tab2.length*0.8; zwiększasz rozmiar o 50% zaś lecisz do 80% powiększonego przy okazji psujesz firstFree
2
            Student tab[] = new Student[size()+size()/2]; // zmienna lokalna
            firstFree=0;
            for(int i=0; i<tab2.length*0.8;i++){//przepisuje do nowej tablicy  
                tab[i] = tab2[i]; // zmienna lokalna
                firstFree++;
            }
            System.out.println("Rozmiar tablicy po powiększeniu: "+tab.length); // zmienna lokalna
            System.out.println("size "+size()); // zmienna globalna

lokalna != globalna

0

@_13th_Dragon wielkie dzięki za to! Szczególnie za to rozwiązanie odnośnie kopiowania tablicy. Ze wszystkim się zgadzam, tylko nie z ostatnim ;) Program działał poprawnie więc nie ma tam żadnego problemu. Chyba że chodzi Ci o to że jest to mało optymalne rozwiązanie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1