Использование сортировки по выбору внутри массива в Java

#java #arrays #selection-sort

#java #массивы #сортировка по выделению

Вопрос:

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

Я также хотел бы знать, есть ли более разумный (менее ручной) способ реализовать массив того типа, который я хотел бы (с именем, возрастом и ростом), потому что я добавлю больше людей, например, 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. Переместите метод сортировки за пределы класса person, в main или какой-либо класс util и используйте массив person age в качестве входных данных…

2.Согласно опубликованному вами коду, метод selectionSort() в классе Person имеет int[] параметр, но в методе main() вы вызываете метод selectionSort() без каких-либо параметров.

3. Это еще одна проблема, я не уверен, как вызвать метод с параметром, когда «типом данных» моего массива является имя класса (Person). Должен ли я просто сделать это selectionSort(age) ?

Ответ №1:

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

 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 .