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.
Drukowanie pól obiektów z tablicy
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Krypton
- Postów: 298
Metody można nadpisywać w praktycznie dowolny sposób. Np:
@Override
public String toString() {
return name;
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@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:
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:
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:
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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Krypton
- Postów: 298
Sposobów by to zrobić jest multum. Pierwszy, który mi się nasuwa na poczekaniu:
return Arrays.toString(people)
.replace("[","")
.replace("]", "");
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@TheLearner: drukuje people:Mati, null, null, także jeszcze do poprawy.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Krypton
- Postów: 298
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? :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@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?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Krypton
- Postów: 298
Żeby nie drukowało nulli, musisz mieć jeszcze dwa obiekty w tablicy (powinny być 3). W twoim kodzie jest jeden zadeklarowany obiekt.
team.addPerson(p1);
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@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 :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 310
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():
Arrays.stream(people).forEach(x -> System.out.println("Hi "+ x.getName() + "!"))
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 310
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ę.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@PanamaJoe:
public class Boss extends Person {
public Boss(String name, int age) {
super(name, age);
}
}
;)
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Krypton
- Postów: 298
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 :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 310
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:
@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);
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@PanamaJoe: mój kumpel wczoraj rozkminił coś takiego:
@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(", "));
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
@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?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Krypton
- Postów: 298
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" :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 310
@3l3ctric_philip: @3l3ctric_philip:
3l3ctric_philip napisał(a):
@PanamaJoe: mój kumpel wczoraj rozkminił coś takiego:
@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:
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 310
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:
return name + ", boss: " + boss.getName() + ", people: "
+ Arrays.stream(people).filter(Objects::nonNull).map(x -> x.getName()).collect(Collectors.joining(","));