[solv]ArrayList.remove(int) nie usuwa, nie zmienia rozmiaru

0

Witam, piszę w Javie program do nauki słówek angielskiego w ramach zaliczenia, i napotkałem problem, którego nie pojmuję. Chodzi o to, że utworzony JPanel w konstruktorze przypisuje prywatnej zmiennej pod nazwą wyrazy referencję do listy obiektów typu ArrayList, w której to znajduje się nieokreślona z góry liczba wyrazów.
W czasie pracy programu, jeśli użytkownik poprawnie odgadnie wyraz, wywoływana jest metoda usunWyraz(), która powinna usunąć wyraz z listy, tak się jednak nie dzieje, rozmiar listy wyrazy jest wciąż taki sam, i żaden z wyrazów nie zostaje usunięty, dlaczego?

Oto fragment kodu

public class DictPanel extends javax.swing.JPanel {

    private MainFrame parent;
    private ArrayList wyrazy;
    private Integer wskaznik;
    private Integer poprawne = 0;
    private Integer niepoprawne = 0;
    private AudioPlayer player;
    private String filepath = "";
    private String odgadywany;
    private Random losowaLiczba = new Random();
    private ArrayList powtarzane = new ArrayList();

    // 0- nauka, wyrazy pl odgadywane
    private int opcja;

    /** Creates new form DictPanel */
    public DictPanel(MainFrame parent_frame, ArrayList wyrazy, int tryb) {
        parent = parent_frame;
        this.wyrazy = wyrazy;
        this.opcja = tryb;
        initComponents();
        odswiez();
    }

////
    private void usunWyraz(){
        System.out.print(wskaznik + ", ");
        wyrazy.remove(wskaznik);
        System.out.print(wyrazy.size() + "\n");
    }

Wynik działania programu (klikanie w przycik, który wywołuje metodę usunWyraz())

5, 6
4, 6
2, 6
3, 6
1, 6
4, 6
1, 6
0, 6
2, 6
3, 6
0, 6
5, 6
5, 6
0, 6

I tak sobie mogę klikać w nieskończoność :/

0

wyrazy.remove(wskaznik);
To jest źle.
Technika poszła na przód i od Java 5 można określić jaki typ danych będzie mieć ArrayList. Ponieważ z tego nie korzystasz w liście masz obiekty typu Object. Wskaźnik jest typem dziedziczącym z Object i taki jest szukany w liście. A więc twoja metoda remove to ta:
public boolean remove(Object o)
a nie jak by się wydawało:
public E remove(int index).
Lista zawiera wyrazy, pewnie typu String, a ty szukasz obiektu typu Integer, a takiego tam nie ma.
Dlatego.

0

Teraz rozumiem, dzięki.

Poprawiłem kod na:

wyrazy.remove(wyrazy.get(wskaznik));

i działa prawidłowo

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