希望有大佬可以逐行解释一下这个java的代码和涉及的知识点

public class Driver1 {

 

 public static void main(String [] args) {  

   Employee emp[] = new Employee [100];

   Employee hold;     //这个hold是用来干嘛的?

  

 

   emp[0]=new Employee("Smith",53,56000); 

   emp[1]=new Employee("Jones",20,34000);

   emp[2]=new Employee("Adams",30,55000);

   emp[3]=new Employee("Simms",45,50000);

   emp[4]=new Employee("Travis",60,60000);                                        

 

   int count=5;          //这个int count = 5;放着一行和放在employee hold;下面会有什么不一样

 

   for ( int pass = 1; pass < count; pass++ ) {

         // loop to control number of comparisons

         for ( int e = 0; e < count - 1; e++ ) {

             if ( emp[e].getName().compareTo (emp[e+1].getName())>0 ) {

               hold = emp[e];        

               emp[e] = emp[e+1]; 

               emp[e+1] = hold;

             } 

         } 

      }

 

   for (int i=0; i<count ; i++){

    if (emp[i].getSalary()>40000 && emp[i].getSalary()<60000  )

     System.out.println(emp[i].getName());

   }

 }

 

}

    

class Employee {

  private String name;

  private int age;

  private double salary;

 

 public Employee(String n, int a, double s){

   name=n;

   age=a;

   salary=s;

 }

 

 public String getName(){

   return name;

 }

 

 public double getSalary(){

   return salary;

 }

}

 

   Employee hold;     //这个hold是用在下面的for循环中作为临时变量用于emp内元素交换位置时临时存放用的

                                  

 

   int count=5;          
                        //这个放在这一行和放在employee hold下没有区别

 

 if ( emp[e].getName().compareTo (emp[e+1].getName())>0 ) { hold = emp[e]; emp[e] = emp[e+1]; emp[e+1] = hold;的作用是,如果emp[e]的名字比emp[e+1]长,那么就交换它们在emp[]中的位置,这样一来,最终的排序会按照名字由短到长排序。

 

 

 


 

1.问题梳理

// for ( int pass = 1; pass < count; pass++ ) 

外层遍历的pass 在你贴的代码中并没有用到;没有实际意义;count为5,就相当于内层遍历重复执行了5次,因为内层遍历没有用到 pass 这个变量。

// Employee hold;     //这个hold是用来干嘛的? 

临时变量,没有实际意义

// 这个int count = 5;放着一行和放在employee hold;下面会有什么不一样

count 在for循环时使用,只要放在for循环之前都可以,没有区别;count = 5实际上就是五个对象,也是数组 emp[] 的实际大小。

2.参考代码如下:

public class Driver1 {
    public static void main(String[] args) {
        // 初始化五个员工对象
        Employee emp[] = new Employee[5];
        emp[0] = new Employee("Smith", 53, 56000);
        emp[1] = new Employee("Jones", 20, 34000);
        emp[2] = new Employee("Adams", 30, 55000);
        emp[3] = new Employee("Simms", 45, 50000);
        emp[4] = new Employee("Travis", 60, 60000);

        // count 其实就是数组的大小
        int count = emp.length;

        // 此处是按名字排序
        // 外层遍历,遍历第0-3个对象;因为第4个对象是最后一个,无需再比对
        // 所以次数遍历次数为 count - 1
        for (int i = 0; i < count - 1; i++) {
            // 内层遍历,遍历当前外层对象后面的所有对象
            // 比如,当前对象为 emp[0],则和 emp[1],emp[2],emp[3],emp[4]做比对
            // 比如,当前对象为 emp[2],则和 emp[3],emp[4]做比对
            // 所以 j 初始化为 i + 1; 因为自身无需和自身进行比对。
            for (int j = i + 1; j < count; j++) {
                // 临时对象 tempEmployee,用于交换位置,达到排序效果
                if (emp[i].getName().compareTo(emp[j].getName()) < 0) {
                    Employee tempEmployee = emp[i];
                    emp[i] = emp[j];
                    emp[j] = tempEmployee;
                }
            }
        }
        
        // 遍历输出按名称排序后且薪水在 40000-60000 之间的员工信息
        for (int i = 0; i < count; i++) {
            if (emp[i].getSalary() > 40000 && emp[i].getSalary() < 60000)
                System.out.println(emp[i].toString());
        }
    }
}

/**
 * 员工实体类,包含员工名称,年龄,薪水
 */
class Employee {
    private String name;
    private int age;
    private double salary;

    public Employee(String n, int a, double s) {
        name = n;
        age = a;
        salary = s;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    // 重写 toString 便于信息查看
    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}

 

Employee hold;     //这个hold是用来干嘛的?就是为了对两个元素进行换位,用一个临时变量存储数据,具体参考如下注释
for ( int pass = 1; pass < count; pass++ ) {
    // loop to control number of comparisons
    for ( int e = 0; e < count - 1; e++ ) {
        if ( emp[e].getName().compareTo (emp[e+1].getName())>0 ) {
            /**
             * 这是一种冒泡排序方式:
             * 定义临时变量,临时存储数据,用于在循环时交换两个位置的元素
             * 比如 e = 0 时,
             *      1.取出元素new Employee("Smith",53,56000),复值给hold
             *      2.取出元素new Employee("Jones",20,34000),复值给emp[0]
             *      3.将hold复值给emp[1],即将元素new Employee("Smith",53,56000)复值给emp[1]
             *      数组中元素发生了换位:emp[0] = new Employee("Jones",20,34000);
             *                        emp[1] = new Employee("Smith",53,56000);
             *       原数组:          emp[0]=new Employee("Smith",53,56000);
             *                        emp[1]=new Employee("Jones",20,34000);
             */
            hold = emp[e];
            emp[e] = emp[e+1];
            emp[e+1] = hold;
        }
    }
}

交换排序

hold是临时变量用于临时存放需要交换的Employee;

这个int count = 5;放着一行和放在employee hold;下面会有没有区别

程序实现按Employee name 排序并输出getSalary大于40000 小于 60000的Employee name

冒泡排序法

这个hold是用来干嘛的?这个hold是起的一个临时Employee对象变量, 用于这个判断条件之后( emp[e].getName().compareTo (emp[e+1].getName())>0 ) ,如果emp[e](Employee对象)的年龄属性值比emp[e+1](Employee对象)的年龄属性值大的话,那么交换这两者在 emp数组中的位置,如果不使用hold这个Employee对象变量,直接无法实现两者位置互换。

int count=5;          //这个int count = 5;放着一行和放在employee hold;下面会有什么不一样

没有区别,

hold是声明变量,没有= 后面的部分说明没有初始化,并未申请内存空间