Какие значения взяты j в цикле - PullRequest
1 голос
/ 26 марта 2020

Какова следующая строка в классе Sort?

for (int j = i+1; j > ListPerson.size(); j++) {

Я добавил System.out.println(j);, чтобы увидеть значения, принятые j, но при выполнении никакое значение не отображается ! Почему Eclipse не считает ListPerson.get(j) ошибкой, зная, что j > ListPerson.size()? !!

package Tests;

public class Person {
    String nom;
    int age;

    public Person(String nom, int age) {
        this.nom = nom;
        this.age = age;
    }           
}

package Tests;

import java.util.ArrayList;
import java.util.List;

import CompUnivSol2.Etudiant;

public class Sort {

    public static void main(String[] args) {            
        List<Person> ListPerson = new ArrayList<Person>();  
        ListPerson.add(new Person("Paul", 20));
        ListPerson.add(new Person("Coco", 18));
        ListPerson.add(new Person("Eric", 4));


        String temp1;
        int temp2;
        for (int i = 0; i < ListPerson.size(); i++) {           
            for (int j = i + 1; j > ListPerson.size(); j++) {               
                if (ListPerson.get(i).age > ListPerson.get(j).age) {

                    temp1 = ListPerson.get(j).nom;
                    ListPerson.get(j).nom = ListPerson.get(i).nom;
                    ListPerson.get(i).nom = temp1;

                    temp2 = ListPerson.get(j).age;      
                    ListPerson.get(j).age = ListPerson.get(i).age;
                    ListPerson.get(i).age = temp2;
                }
            }
        } 

        for (int i = 0; i < ListPerson.size(); i++) {
            System.out.print("\n N°" + (i + 1) + ": " + ListPerson.get(i).nom + ": " + ListPerson.get(i).age); //le \n pour mettre chaque
                                                                                //établissement dans 1 ligne
        }
    }
}

последний l oop в классе Sort отображает следующее :

№ 1: Пол: 20

№ 2: Коко: 18

№ 3: Eri c: 4

1 Ответ

2 голосов
/ 26 марта 2020

Из-за j > ListPerson.size() в следующей строке

for (int j = i + 1; j > ListPerson.size(); j++)

этот l oop вообще не выполняется.

Когда i = 0 -----> j = 1 -----> условие оценивается как 1 > 3 (т.е. j > ListPerson.size())

Как вы можете понять, 1 > 3 равно false, и, следовательно, l oop не получает Выполнено.

Вам необходимо изменить его на

for (int j = i + 1; j < ListPerson.size(); j++)

Кроме этой проблемы, логика сортировки c также неверна. Вместо того, чтобы менять местами людей, вы просто меняете их имена. Чтобы устранить проблему, замените

String temp1;
int temp2;
for (int i = 0; i < ListPerson.size(); i++) {           
    for (int j = i + 1; j > ListPerson.size(); j++) {               
        if (ListPerson.get(i).age > ListPerson.get(j).age) {

            temp1 = ListPerson.get(j).nom;
            ListPerson.get(j).nom = ListPerson.get(i).nom;
            ListPerson.get(i).nom = temp1;

            temp2 = ListPerson.get(j).age;      
            ListPerson.get(j).age = ListPerson.get(i).age;
            ListPerson.get(i).age = temp2;
        }
    }
}

на

Person temp = null;
for (int i = 0; i < ListPerson.size(); i++) {           
    for (int j = i + 1; j < ListPerson.size(); j++) {  
        if (ListPerson.get(i).age > ListPerson.get(j).age) {
            temp = ListPerson.get(i);
            ListPerson.set(i, ListPerson.get(j));
            ListPerson.set(j, temp);
        }
    }
}

Однако элегантным способом было бы использовать Collections.sort вместо сортировки таким способом.

Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

...