Widoczność listy w klasie głównej, Java.

0

Witam, od tygodnia bawię się z Javą, próbuję napisać listę tablicową z takimi metodami, ale mam pewien problem, ponieważ nie wiem jak zrobić, aby

ArrayList<Positions> list = new ArrayList<>();

było widoczne w klasie main oraz oczywiście metody, czy w takim razie powinnam napisać konstruktor inicjalizujący listę w klasie Positions, a następnie go wywołać w main? Za każdą radę dziękuję.

Klasa Postions:

import java.util.ArrayList;
import java.util.Scanner;

public class Positions {
    ArrayList<Positions> list = new ArrayList<>();

    private String name;
    private int age;
    private int ID;
    String nameAdd;
    int ageAdd;
    int IDAdd;

    public Positions(String name, int age, int ID) {
        this.name = name;
        this.age = age;
        this.ID = ID;
    }

    public void getInfos() {
        System.out.println("Dodaj element do tablicy: ");
        Scanner in = new Scanner(System.in);
        System.out.print(" Podaj imie:");
        nameAdd = in.nextLine();
        System.out.println();
        System.out.print("Podaj wiek: ");
        ageAdd = in.nextInt();
        System.out.println();
        System.out.print("Podaj ID: ");
        IDAdd = in.nextInt();
        System.out.println();
    }

    public void addPosition() {
        getInfos();
        ArrayListTest.Positions pos = new ArrayListTest.Positions(nameAdd, ageAdd, IDAdd);
        list.add(pos);
    }

    public void removePosition() {
        System.out.println("Podaj element do usuniecia: ");
        Scanner in = new Scanner(System.in);
        int index;
        list.remove(index);
    }

    public void setOnAnyPosition() {
        System.out.println("Dodaj element do tablicy: ");
        Scanner in = new Scanner(System.in);
        int index;
        System.out.println("Podaj indeks: ");
        index = in.nextInt();
        ArrayListTest.Positions pos2 = new ArrayListTest.Positions(nameAdd, ageAdd, IDAdd);
        list.set(index, pos2);
    }

    public void ArraySizeShow()
    {
        System.out.println(list.size());
    }

    public void changePosition() {
        System.out.println("Dodaj element do tablicy ktory chcesz zmienic : ");
        Scanner in2 = new Scanner(System.in);
        String nameAdd3;
        int index2;

        System.out.println("Podaj indeks: ");
        index2 = in2.nextInt();

        ArrayListTest.Positions pos2 = new ArrayListTest.Positions(nameAdd, ageAdd, IDAdd);
        list.set(index2, pos2);
    }

Klasa ArrayList:

package ArrayListTest;

import java.util.ArrayList;

public class ArrayList2
{
    public static void main (String[] args)
    {


        System.out.println("----LISTA TABLICOWA-----");
        System.out.println("Co chcesz wykonać? ");
        System.out.println("1. Dodac element do listy. ");
        System.out.println("2. Usunac elemnt z listy.");
        System.out.println("3. Wstawić na dowolna pozycje.");
        System.out.println("4. Rozmiar listy.");
        System.out.println("5. Zmienic wartosc na podanym indeksie.");
        int choice;

        for(;;) {
            switch (choice)
            {
                case 1:
                {
                    list.addPosition; //` ** tutaj nie widać* list* ani metody *addPosition***`
                }
            }
        }
    }
}

1

metoda main jest statyczna. Zeby zrobic co chcesz musisz zrobic sobie Positions p = new Positions() i na obiekcie p.addPosition()

1

ArrayList<Positions> list = new ArrayList<>();

polecam zmienić na List<Positions> list = new ArrayList<>();

for(;;)

jeśli wiesz ile jest elementów to lepiej zwyczajnie iterować, a jak nie wiesz to while() jest lepszym rozwiazaniem

public void ArraySizeShow()

metody lepiej pisać camelCase

list.addPosition; // ** tutaj nie widać* list* ani metody *addPosition***

nie widać, bo nie jest to nigdzie zainicjalizowane

0

@trojanus Wszystko poprawione, tylko właśnie nie wiem jak to zrobić z inicjalizacją, bo jeśli dobrze rozumiem, jak zainicjuję w main to nie będzie tego widzieć tego klasa Positions.

import java.util.ArrayList;
import java.util.Scanner;
import java.util.List;

public  class Positions {

    List<Positions> list = new ArrayList<>();

    private static String name;
    private static int age;
    private static int ID;
    String nameAdd;
    int ageAdd;
    int IDAdd;

    public Positions(String name, int age, int ID) {
        this.name = name;
        this.age = age;
        this.ID = ID;
    }
    public Positions()
    {
        this(name,age,ID);
    }

    public void getInfos() {
        System.out.println("Dodaj element do tablicy: ");
        Scanner in = new Scanner(System.in);
        System.out.print(" Podaj imie:");
        nameAdd = in.nextLine();
        System.out.println();
        System.out.print("Podaj wiek: ");
        ageAdd = in.nextInt();
        System.out.println();
        System.out.print("Podaj ID: ");
        IDAdd = in.nextInt();
        System.out.println();
    }

    public void addPosition() {
        getInfos();
        Positions pos = new Positions(nameAdd, ageAdd, IDAdd);
        list.add(pos);
    }

    public void removePosition() {
        System.out.println("Podaj element do usuniecia: ");
        Scanner in = new Scanner(System.in);
        int index;
        list.remove(index);
    }

    public void setOnAnyPosition() {
        System.out.println("Dodaj element do tablicy: ");
        Scanner in = new Scanner(System.in);
        int index;
        System.out.println("Podaj indeks: ");
        index = in.nextInt();
       Positions pos2 = new Positions(nameAdd, ageAdd, IDAdd);
        list.set(index, pos2);
    }

    public void arraySizeShow() {
        System.out.println(list.size());
    }

    public void changePosition() {
        System.out.println("Dodaj element do tablicy ktory chcesz zmienic : ");
        Scanner in2 = new Scanner(System.in);
        String nameAdd3;
        int index2;

        System.out.println("Podaj indeks: ");
        index2 = in2.nextInt();

        Positions pos2 = new Positions(nameAdd, ageAdd, IDAdd);
        list.set(index2, pos2);
    }
}

package ArrayListTest;
import java.util.ArrayList;
import java.util.Scanner;

public class ArrayList2
{
    public static void main (String[] args)
    {
        Positions p = new Positions();
        System.out.println("----LISTA TABLICOWA-----");
        System.out.println("Co chcesz wykonać? ");
        System.out.println("1. Dodac element do listy. ");
        System.out.println("2. Usunac elemnt z listy.");
        System.out.println("3. Wstawić na dowolna pozycje.");
        System.out.println("4. Rozmiar listy.");
        System.out.println("5. Zmienic wartosc na podanym indeksie.");
        System.out.println("podaj pozycję: ");
        Scanner ch = new Scanner(System.in);
        int choice= ch.nextInt();

        while(true) {
            switch (choice)
            {
                case 1:
                {
                    p.addPosition; //?
                    break;
                }
                case 2:
                {

                    break;
                }
                case 3:
                {
                    break;
                }
                case 4:
                {
                    break;
                }
                case 5:
                {
                    break;
                }
            }
        }
    }
}

0

Dodałam metodę która wyświetla listę, jednak elementy są jakby nadpisywane, tzn, ilekroć wpisałam liczb, tyle samo razy wypisuje dane ostatnio wprowadzonego elementu. Czy to błąd z metodą czy z programem?

 public void printArray() {
        for (int i = 0; i < list.size(); i++) {
            System.out.println(i + " : " + " NAME: " + name + " AGE: " + age + " ID: " + ID);
        }
0

W pętli nigdzie nie pobierasz elementów z listy. name, age i ID dotyczą tylko obiektu, z którego jest wywoływane printArray(). Tak naprawdę po niczym nie iterujesz i jedynie zwiększasz indeks w pętli.

0

A więc pasuje napisać akcesory do każdego pola i potem je wywoływać w metodzie drukującej?

0

Ach, rety... dopiero zobaczyłem, że te zmienne są statyczne. W takim razie one z definicji muszą być wszędzie takie same. Dalej pozostanie wcześniejszy problem, ale najpierw pozbądź się tych statycznych pól, jeśli chcesz mieć unikalne pola dla obiektów. Potem w pętli możesz dobierać się do obiektu, wyciągając go z listy i pobierać jego pola.

0

Nie chcę cię martwić, ale to co napisałaś to są bzdury. Te statici w klasie Positions to widać ze dodane na zasadzie "bo IDE zaznaczyło na czerwono i zasugerowało żeby dodać static to błąd zniknie", zupełnie bez zrozumienia co robisz.

  1. Nie rozumiem jaki jest sens tej klasy Positions i czemu przechowuje ona listę obiektów Positions. Jakaś mocna incepcja ci tu weszła. Zrób osobną klasę na te age, name, id a w klasie Positions przechowuj listę takich obiektów.
  2. Jedyny static w całym kodzie ma być tu: public static void main, wszystkie inne idą do kosza
  3. Nie rób pól klasy w stylu nameAdd, IDadd... to maja być lokalne zmienne funkcji! Po co robisz z tego pola klasy?
  4. Zwracaj wyniki z metod! Zamiast jakichś cudów na kiju w stylu twojego void getInfos, czemu nie zwrócisz z tejże metody obiektu z wczytanymi danymi?

Wyjdź od takiego kodu:

class A{
    private final String name;
    public A(String n){
        this.name=n;
    }
}

class B{
    private final List<A> objects = new ArrayList<>();
}

class Main{
    public static void main(String[] args){
        B b = new B();
    }
}

0

Dodałam akcesory do każdego z pól, wyrzuciłam static, tak jak piszesz, i wywołałam konstruktor domyślny. A w metodzie drukującej posłużyłam się metodą get().metoda i zadziała wszystko. dzięki.

0
Kamila Nowak napisał(a):

Dodałam akcesory do każdego z pól, wyrzuciłam static, tak jak piszesz, i wywołałam konstruktor domyślny. A w metodzie drukującej posłużyłam się metodą get().metoda i zadziała wszystko. dzięki.

To jest (dość częste) odwrócenie designu. Oczywiście nie jest to nic prawidłowego
getCrocodile().getMounth().getStomach().putFood()

zamiast crocodile.eat(food)

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