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是声明变量,没有= 后面的部分说明没有初始化,并未申请内存空间