#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
.