Использование сортировки выбора в массиве в Java - PullRequest
0 голосов
/ 31 марта 2019

У меня есть класс с именем Person, где у меня есть конструктор, геттеры и сеттеры для трех переменных: имя, возраст и рост. Я также реализовал метод сортировки Selection в этом классе, чтобы сортировать возраст людей. Затем я создал массив из десяти человек и дал им разные имена, возраст и высоту, но я не получил возможность использовать метод сортировки Selection для сортировки возрастов людей. Я хотел бы знать, не могли бы вы помочь мне узнать, что я делаю неправильно и почему я не смог использовать метод в моем массиве.

Я также хотел бы знать, есть ли более разумный (менее ручной) способ реализации массива типа, который я хотел бы (с именем, возрастом и ростом), потому что я добавлю больше людей, например 20 человек и это потребует дополнительной работы, которую, я думаю, я мог бы сохранить с помощью лучшего метода. Я знаю, как сделать это со списком массивов, но я хотел бы знать, с массивом, если это возможно, или разумно.

//Class Person

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

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

public String getName (){
    return name;
}

public int getHeight (){
    return height;
}

public int getAge (){
    return age;
}

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

public void setHeight (int height) {
    this.height=height;
}

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

public int[] selectionSort (int[] age){

    int i, j, minValue, minIndex, temp =0;

    for (i = 0; i<age.length; i++) {
        minValue = age[i];
        minIndex = i;

        for (j=i; j<age.length; j++) {

            if (age[i]<minValue){
                minValue = age [j];
                minIndex = j;
            }
        }
        if (minValue<age[i]){
            temp=age[i];
            age[i]=age[minIndex];
            age[minIndex]=temp;
        }
    }
return age;
}
}

//Array implementation

public class Main {

public static void main(String[] args) {

Person [] persons = new Person [3];

    persons [0] = new Person ();
    persons [0].setName("Josef");
    persons [0].setHeight(170);
    persons [0].setAge(30);

    persons [1] = new Person ();
    persons [1].setName("Marie");
    persons [1].setHeight(160);
    persons [1].setAge(35);

    persons [2] = new Person ();
    persons [2].setName("Karel");
    persons [2].setHeight(180);
    persons [2].setAge(40);

    for (int i=0; i<persons.length; i++){
        System.out.println("Jméno: " + persons[i].getName()+ ", věk: " + persons[i].getAge() + ", vyška: " + persons[i].getHeight());
    }

    //My main problem is here
    for (int i = 0; i<persons.length; i++){
        System.out.println(persons[i].selectionSort());
    }

}
}

1 Ответ

0 голосов
/ 31 марта 2019

Есть несколько проблем с вашим кодом, вы должны изучить его онлайн и прояснить свои концепции.Однако я собираюсь объяснить немного:

System.out.println(persons[i].selectionSort());

Теперь вы создали этот метод selectionSort(), и вы можете использовать его для объекта типа Person, но он ожидает параметр типаint[], который вы не предоставляете.

Это логическая ошибка, selectionSort не работает так, что вы не можете вызвать этот метод для каждого индекса массива.Это его работа, чтобы отсортировать массив сразу.Таким образом, вы должны передать весь массив persons[], а остальное будет сделано selectionSort()

public int[] selectionSort (int[] age)

Вы используете int age[], вы не можете сделать это, потому что у вас нетмассив типа int, у вас есть массив типа Person каждый объект типа Person имеет атрибут age, и вы можете получить к нему доступ с помощью dot operator.

Рабочий код:

public class Person 
{
    public static Person [] persons = new Person [3];  // so that every method can access this array
    private String name;
    private int height;
    private int age;  

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

    public String getName (){
        return name;
    }

    public int getHeight (){
        return height;
    }

    public int getAge (){
        return age;
    }

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

    public void setHeight (int height) {
        this.height=height;
    }

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

    public static void selectionSort(Person persons[])
    {
        int smallest;

        for(int i = 0; i < persons.length; i++)
        {
            smallest=i;
            for(int index = i+1; index<persons.length; index++)
                if(persons[index].age<persons[smallest].age)
                    smallest=index;

            swap(i,smallest);   
        }
    }

    public static void swap(int frst, int scnd)
    {
        Person temporary = persons[frst];
        persons[frst] = persons[scnd];
        persons[scnd] = temporary;
    }

    public static void main(String[] args) 
    {
        persons [0] = new Person ();
        persons [0].setName("Josef");
        persons [0].setHeight(170);
        persons [0].setAge(35);

        persons [1] = new Person ();
        persons [1].setName("Marie");
        persons [1].setHeight(160);
        persons [1].setAge(31);

        persons [2] = new Person ();
        persons [2].setName("Karel");
        persons [2].setHeight(180);
        persons [2].setAge(40);

        for (int i=0; i<persons.length; i++){
            System.out.println("Jmeno: " + persons[i].getName()+ ", vek: " + persons[i].getAge() + ", vyska: " + persons[i].getHeight());
        }

        selectionSort(persons);
        for (int i = 0; i<persons.length; i++){
            System.out.println(persons[i].age);
        }
    }
}

ПРИМЕЧАНИЕ: Я объединил код в одном классе Person, но вы всегда можете разделить их на Main и Person.Если вы разделите код, рекомендуется включить selectionSort() в Main.

...