Drukowanie pól obiektów z tablicy

Drukowanie pól obiektów z tablicy
3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

Hej, kto mi podpowie jak wydrukować za pomocą metody toString tylko i wyłącznie imiona z tablicy typu Person, gdzie w polach mamy przykładowo imię, nazwisko i wiek. Wydruk musi być bez nawiasów kwadratowych.

TheLearner
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krypton
  • Postów: 298
0

Metody można nadpisywać w praktycznie dowolny sposób. Np:

Kopiuj
@Override
    public String toString() {
        return name;
    }

3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@TheLearner: nie do końca doczytałeś o co mi chodzi. sprecyzuję w takim razie. lecimy:

Mamy klasę Team w której mamy metodę addPerson w której wrzucamy do tablicy obiekty typu Person:

Kopiuj
public class Team {
    private String name;
    private Person person;
    private Boss boss;
    private Person [] people = new Person[3];

    int counter = 0;

    public Team(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setBoss(Boss b1){
        this.boss =b1;
    }

    public void addPerson(Person p1) throws TooManyPeopleException{
        people[counter] = p1;
        counter++;
    }

    @Override
    public String toString() {
        return name+", boss: "+boss.getName()+", people: "+ ?????);
    }
}

W Main coś takiego:

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

        Person p1 = new Person("Mati", 5);
        Boss b1 = new Boss("Jarosław", 120);
        Person p3 = (Person) b1;
        p1.sayHelloTo(p3);
        p3.sayHelloTo(p1);
        Team team = new Team("KOSZYK");
        team.setBoss(b1);
        try {
            team.addPerson(p1);
        } catch (TooManyPeopleException e) {
            e.printStackTrace();
        }
        System.out.println(team);
    }
}

Klasa Person:

Kopiuj
public class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void sayHelloTo(Person p3) {
        System.out.println("Hi "+p3.getName()+"!");
    }

    @Override
    public String toString() {
        return name;
    }
}

W wyniku mam otrzymać taki wydruk:

Hi Jarosław!
Hi Mati!
KOSZYK, boss: Jarosław, people: Mati

TheLearner
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krypton
  • Postów: 298
0

Sposobów by to zrobić jest multum. Pierwszy, który mi się nasuwa na poczekaniu:

Kopiuj
return Arrays.toString(people)
                .replace("[","")
                .replace("]", "");
3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@TheLearner: drukuje people:Mati, null, null, także jeszcze do poprawy.

TheLearner
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krypton
  • Postów: 298
0

Ale to, że znajdują się tam nulle, to zupełnie inny problem. toString działa poprawnie. Tam są nulle, więc jak może drukować coś innego? :)

3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@TheLearner: aha, bo rozumiem, że to są te dwa null z indeksów tablicy 1 i 2. jasne. to teraz jeszcze rozkminić, aby nie drukował nulli. może jakaś lambda?

TheLearner
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krypton
  • Postów: 298
0

Żeby nie drukowało nulli, musisz mieć jeszcze dwa obiekty w tablicy (powinny być 3). W twoim kodzie jest jeden zadeklarowany obiekt.

Kopiuj
team.addPerson(p1);
3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@TheLearner: tak, wiem. ale się uparłem i chcę to rozkminić, aby toString nie drukował nulli, mimo wszystko, że tablica nie jest w pełni zapełniona :)

PanamaJoe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
0
3l3ctric_philip napisał(a):

@TheLearner: aha, bo rozumiem, że to są te dwa null z indeksów tablicy 1 i 2. jasne. to teraz jeszcze rozkminić, aby nie drukował nulli. może jakaś lambda?

Mając nadpisaną w Person tak jak to Ci pokazał @TheLearner metodę toString() możesz wypisać Hi.. ktośtam do wszystkich osób z Main wywołując poniższe zamiast tych 2 sayHelloTo():

Kopiuj
Arrays.stream(people).forEach(x -> System.out.println("Hi "+ x.getName() + "!"))
3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@PanamaJoe: Required type: String, poza tym nie zmieniamy nic w Main, wydruk musi być taki:
Hi Jarosław!
Hi Mati!
KOSZYK, boss: Jarosław, people: Mati

PanamaJoe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
0

@3l3ctric_philip:

3l3ctric_philip napisał(a):

@PanamaJoe: Required type: String, poza tym nie zmieniamy nic w Main, wydruk musi być taki:

No faktycznie coś może być nie tak. Nie zauważyłem, że tej tablicy z osobami nie masz w Main, tylko w Team :D Sorry. Pokaż jeszcze tego BOSSa, to sobie wkleję do IDE wszystko i sprawdzę.

3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@PanamaJoe:

Kopiuj
public class Boss extends Person {

    public Boss(String name, int age) {
        super(name, age);
    }
}

;)

TheLearner
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krypton
  • Postów: 298
0
3l3ctric_philip napisał(a):

@TheLearner: tak, wiem. ale się uparłem i chcę to rozkminić, aby toString nie drukował nulli, mimo wszystko, że tablica nie jest w pełni zapełniona :)

Łatwiej byłoby stworzyć listę zamiast tablicy :) Nie będzie nuli :)

PanamaJoe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
2

@3l3ctric_philip:

Dobra, rozkminiłem chyba o co Ci chodzi :D

Rozumiem, że nie chcesz nic ruszać oprócz miejsca z pytajnikami w Team, to zmień sobie tam na coś takiego:

Kopiuj
    @Override
    public String toString() {
        String team = name + ", boss: " + boss.getName() + ", people: "
                + Arrays.stream(people).filter(Objects::nonNull).map(x -> x + ", ").collect(Collectors.joining());
        return team.substring(0, team.length() - 2);
    }
3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@PanamaJoe: mój kumpel wczoraj rozkminił coś takiego:

Kopiuj
@Override
    public String toString() {
        return name+", boss: "+boss.getName()+", people: "+Arrays.asList(people).stream().filter(x->x!=null).map(x->x.getName()).collect(Collectors.joining(", "));
    }
3P
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 72
0

@PanamaJoe, @TheLearner Teraz pytanie do Państwa. Czego się uczyć i z jakich materiałów, aby ogarniać takie kwestie? Do przerobienia mam strumienie, lambdy, referencje do metod. ktoś coś doradzi?

TheLearner
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Krypton
  • Postów: 298
0
3l3ctric_philip napisał(a):

@TheLearner Teraz pytanie . Czego się uczyć i z jakich materiałów, aby ogarniać takie kwestie:strumienie, lambdy

Ja jestem za cienki żeby się wypowiadać w tych kwestiach :) Sam używam ich bardzo "nienaturalnie" :)

PanamaJoe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
0

@3l3ctric_philip: @3l3ctric_philip:

3l3ctric_philip napisał(a):

@PanamaJoe: mój kumpel wczoraj rozkminił coś takiego:

Kopiuj
@Override
    public String toString() {
        return name+", boss: "+boss.getName()+", people: "+Arrays.asList(people).stream().filter(x->x!=null).map(x->x.getName()).collect(Collectors.joining(", "));
    }

Można też tak, nie będzie trzeba obcinać ostatnich 2 znaków. U mnie by trzeba było zmienić na:

Kopiuj
        return name + ", boss: " + boss.getName() + ", people: "
                + Arrays.stream(people).filter(Objects::nonNull).map(x -> x.toString()).collect(Collectors.joining(","));
3l3ctric_philip napisał(a):

@PanamaJoe, @TheLearner Teraz pytanie do Państwa. Czego się uczyć i z jakich materiałów, aby ogarniać takie kwestie? Do przerobienia mam strumienie, lambdy, referencje do metod. ktoś coś doradzi?

Google ci podpowie mnóstwo wyników - tu na forum podpatruj @Shalom - pokazuje na praktycznych przykładach, jakich nie znajdziesz nawet na Stackoverflow :D

PanamaJoe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
1

A jeszcze tak wracając ogólnie do nadpisywania toString(), to przyszło mi do głowy, że może lepiej by było nie nadpisywać tego w Person, skoro w Team już to robisz. Bo masz tam w Person gettera do pola name. Czytelniej by więc było juz przy tych streamach, gdybyś wyciągał tylko to pole - od razu by było widać skąd się to bierze:

Kopiuj
         return name + ", boss: " + boss.getName() + ", people: "
                 + Arrays.stream(people).filter(Objects::nonNull).map(x -> x.getName()).collect(Collectors.joining(","));

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.