Osoba z najwyższym dochodem - program

0

(początkujący) Siemka :) . Znajdź osobę z największym dochodem. Czyli konsola ma wypisac np: Najwyższy dochód: Kazimierz Stonoga 4500. Klasy obiekty tablice wszystko sam stworzyłem tylko zostało jeszcze znaleźć delikwenta co najwięcej zarabia.
Stworzyłem w klasie Student i Employee metodę o tej samej nazwie getIncome, ale różnych argumentach, czy można jej jakoś użyć do rozwiązania tego zadania ? Czy zrobić to jakoś inaczej ?

public class Person {

    String name;
    String surname;
    long pesel;
    String city;

    public Person(String name, String surname, long pesel, String city) {
        this.name = name;
        this.surname = surname;
        this.pesel = pesel;
        this.city = city;
    }

    public String getName() {
        return name;
    }

    public String getSurname() {
        return surname;
    }

    public long getPesel() {
        return pesel;
    }

    public String getCity() {
        return city;
    }

    public String toString(){
        return name + " " + surname + ", PESEL: " + pesel + " city: " + city;
    }
}

public class Employee extends Person {

    String position;
    int salary;

    public Employee(String name, String surname, long pesel, String city, String position, int salary) {
        super(name, surname, pesel, city);
        this.position = position;
        this.salary = salary;
    }

    public String getPosition() {
        return position;
    }

    public int getSalary() {
        return salary;
    }
    public int getIncome() {
        return salary;
    }

    @Override
    public String toString(){
        return name + " " + surname + ", PESEL: " + pesel + " city: " + city + " position: " + position + " salray: " + salary + " PLN";
    }
}


public class Student extends Person {

    int group;
    int scholarship;

    public Student(String name, String surname, long pesel, String city, int group, int scholarship) {
        super(name, surname, pesel, city);
        this.group = group;
        this.scholarship = scholarship;
    }

    public int getGroup() {
        return group;
    }

    public int getScholarship() {
        return scholarship;
    }

    public int getIncome() {
        return scholarship;
    }

    @Override
    public String toString() {
        return name + " " + surname + ", PESEL: " + pesel + " city: " + city + " group: " + group + " scholarship: " + scholarship + " PLN";
    }
}

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

        Person [] persons = new Person[4];
        persons[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
        persons[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 650);
        persons[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 4000);
        persons[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);

        for (Person p : persons){
            System.out.println(p);
        }
    }
}
3

Dziwne jest to salary jako int, ale OK :P
Dwie podpowiedzi:

  1. miejsce inome to chyba powinno być w klasie Person
  2. Potrzebna jest pętla (tutaj najbardziej pasuje for)
4

@KotAli: ogólnie ja to bym zrobił trochę inaczej.

Pierwsza - dorzucił interfejs, np. Earner:

interface Earner {
    int getIncome(); 
}

I potem dorzucił implementację do klas:

public class Student extends Person implements Earner {
    // ... inny kod

    @Override 
    public int getIncome() {
        return scholarship;
    }
}

public class Employee extends Person implements Earner {
    // ... inny kod

    @Override
    public int getIncome() {
        return salary;
    }
}

I wtedy możesz sobie wrzucić instancje do tablicy:

Earner[] earners = new Earner[4];
// ... dorzuć instancje

for (Earner r: earners) {
    int income = r.getIncome();
    // dorzuć logikę znajdującą najwyższą wypłatę
}

Druga opcja to po prostu potraktowanie przychodu jako własności osoby, tj.

public Person(String name, String surname, long pesel, String city) {
    this.name = name;
    this.surname = surname;
    this.pesel = pesel;
    this.city = city;
}

public int getIncome() {
    return 0;
}

I potem tak jak wcześniej - tylko bez implementowania interfejsu.

0

Zrobiłem to pierwszym sposobem i kicha. Próbowałem na różne sposoby... i z warunkami i instancjami w tablicy.
Jak to można naprawić te niezgodne typy ??
Literka "r" - zaznaczone w kodzie.
Incompatible types. Found: 'Zadanie727', required: 'int'

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

    Person[] persons = new Person[4];
    persons[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
    persons[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 650);
    persons[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 4000);
    persons[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);

    for (Person p : persons) {
        System.out.println(p);
    }

    Earner[] earners = new Earner[4];
    earners[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
    earners[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 650);
    earners[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 4000);
    earners[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);

    for (Earner r : earners) {
        int income = r.getIncome();
        if (earners[r] > income) { // tutaj wysakuje błąd na literce [r] - niezgodne typy
            income = r.getIncome();
        }
        System.out.println(income);
    }
}

}

1

@KotAli: Zwróć uwagę w których miejscach ustawiasz wartość zmiennej income. Robisz to w każdej iteracji pętli. Spróbuj ustawić wartość początkową przed pętlą, a w pętli zaktualizuj ją dopiero po sprawdzeniu, że aktualna jest większa od najwyższej.

0

Kiedy chce cokolwiek ustawić przed pętlą to też wyskakuje error. Program się wykrzacza. Zdaje sobie sprawę że przed pętlą powinna być jakaś wartość początkowa żeby od czegoś zacząć.

1

Typie

for (Earner r : earners) {
        int income = r.getIncome();
        if (earners[r] > income) { // tutaj wysakuje błąd na literce [r] - niezgodne typy
            income = r.getIncome();
        }
        System.out.println(income);
    }

Co Ty robisz tutaj? pobierasz earnera o indeksie earner xD
Albo robisz for eacha albo robisz fora na podstawie długości tablicy

3

To: for (Earner r : earners) przypisuje ci do r obiekt typu Earner
To: earners[r] > income jest źle, bo indeks tablicy to int a nie Earner pytanie po co odwołujesz się do całej tablicy, skoro już w r masz wszystko czego potrzebujesz i w dodatku linijkę wyżej pobierasz sobie i przypisujesz (bez sensu, ale to już inny problem) zarobki tego gostka?

Masz zrobić coś takiego:
zadeklarować zmienną Earner richest
w pętli sprawdzać, czy aktualny element nie zarabia więcej niż ten już przypisany, jeżeli to prawda, to przypisać aktualny element do zmiennej richest
jak cała pętla przejdzie, to do zmiennej richest masz przypisanego najlepiej zarabiającego gościa.

0

Gotowców nie chce. Po prostu się uczę i na razie na tym etapie banalne rzeczy są dla mnie trudne a dla was błahe. Mniejsza z tym.
Udało się, wypisało największą wartość wraz z imieniem. I pozostał chyba ostatni problem z wartością PESEL. Będzie się tak zdarzało że ktoś będzie miał PESEL który zaczyna się na 00......itd. Jak sobie poradzić z tym problemem ? Jakiegoś innego typu użyć do zmiennej PESEL ?

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

        Earner[] person = new Earner[5];
        person[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
        person[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 1650);
        person[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 5000);
        person[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);
        person[4] = new Student("Magda", "Kachniarz", 88153329159L, "Warszawa", 5,20000); // Poprawić pesel bo jak jest 00.. to jest error;

        for (Earner r : person) {
            System.out.println(r);
        }

        int richest = person[0].getIncome();
        for (Earner earner : person) {
            if (earner.getIncome() > richest) {
                richest = earner.getIncome();
            }
        }
        for (int i = 0; i < person.length; i++) {
            if (richest == person[i].getIncome()) {
                System.out.println("\nNajwiększy dochód ma: " + person[i].getNameAndSurname() + " " + richest + " PLN");
            }
        }
    }
}
1

Numer PESEL powinien być moim zdaniem osobnym typem (klasą, którą powinieneś sobie sam stworzyć):

public class Pesel{
private final String pesel;
   public Pesel(String pesel){
      //tutaj jakaś walidacja, długość, znaki, suma kontrolna
      this.pesel = pesel;
}

//nadpisanie metody toString z Object
   @Override
   public String toString(){
      return pesel;
   }
}
3

Pesel powinien być stringiem. na razie nie ma potrzeby żebyś się przejmował VO.

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