Java:如何按降序打印对象列表的值'属性?

时间:2014-03-20 01:19:29

标签: java

编辑:我现在感谢大家!

我应该做的是按照降序排列所有员工的总工作时间,如员工C:100小时,员工A:70,员工B:50等。

我已经设置了所有内容以输入所有内容,现在我拥有了具有总小时值的对象,我只是无法找出打印最高总小时数的对象。到目前为止,我所拥有的内容会打印出最高级别的内容,但是当它到达时它会跳过最高的那些。

我使用“比较器”之类的东西看到的每一个问题,我似乎无法开始工作,也许我只是不理解如何让它们发挥作用。

任何帮助都将不胜感激。

import java.util.*;
import java.util.Collections;

public class Employee {
    public String name;
    public int[] hours = new int[7];
    public int totalHours;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter number of employees");
        int a = input.nextInt();
        Employee[] employeeNames = new Employee[a];
        for (int i = 0; i < a; i++) {
            employeeNames[i] = new Employee();
        }
        for (Employee b : employeeNames) {
            System.out.println("Enter name of employees");
            b.setName(input.next());
            System.out.println("Enter hours");
            for (int i = 0; i < 7; i++) {
                b.setHours(i, input.nextInt());
            }
        }

        for (Employee b : employeeNames) {
            b.setTotalHours();
            System.out.print("Employee: " + b.getName() + " ");
            System.out.println(b.getHours());
        }
        int count = 0;
        for (int i = 0; i < employeeNames.length; i++) {

            for (int j = 1; j < employeeNames.length;j++) {
                if (employeeNames[i].getTotalHours() >= employeeNames[j].getTotalHours()) {
                    count++;
                }
            }
            if(count >= employeeNames.length - i){
                System.out.println(employeeNames[i].getTotalHours());
            }
        }

    }

    private void setName(String a) {
        name = a;
    }

    private String getName() {
        return name;
    }

    private void setHours(int i, int a) {
        hours[i] = a;
    }

    private String getHours() {
        return Arrays.toString(hours);
    }

    private void setTotalHours() {
        for (int i = 0; i < hours.length; i++) {
            totalHours += hours[i];
        }
    }

    private int getTotalHours() {
        return totalHours;
    }

}

3 个答案:

答案 0 :(得分:1)

您可以使用Comparators或实施Comparable界面

实现Comparable接口应该是这样的:

public class Employee implements Comparable<Employee> {

....

    @Override
    public int compareTo(Employee employee){
        return this.totalHours - employee.totalHours;
    }

}

然后你只需要排序:

Arrays.sort(employeeNames);

此代码尚未经过测试。

答案 1 :(得分:1)

Java在Collections和Arrays类中都有一个静态的.sort()方法,可以让你完成你的目标。 .sort()方法采用Collection或Array,具体取决于您要排序的内容和Comparator。

Comparator是一个对象,它通过指示您感兴趣的类型的任何给定对象何时大于,等于或小于该类型的另一个对象来控制对Array或Collection的排序方式。 Comparator接口有一个名为compare()的方法,它接受两个对象(要对Array或Collection中的任意对象进行排序),如果对象相等则返回0,&lt;如果第一个对象小于第二个对象,则为0,并且>如果第一个对象大于第二个对象,则为0。然后,.sort()方法使用有效的排序算法,根据Comparator的排序概念对Collection或Array进行排序。

有关比较器的详细信息,请参阅http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

您可能希望定义一个比较器,从另一个员工中减去一个员工小时以确定顺序:

Arrays.sort(employeeNames, new Comparator<Employee>() {
    @Override
    public int compare(Employee firstEmployee, Employee secondEmployee) {
        return secondEmployee.getTotalHours() - firstEmployee.getTotalHours();
    }       
});

执行此代码后,您的数组employeeNames将按总小时数的降序排序。然后,您可以遍历列表并根据需要进行打印。

答案 2 :(得分:1)

这是一个简单的例子,让你了解对象的目标:

public class Employee实现Comparable {

String eid;
String ename;
int esal;

public Employee(String eid, String ename, int esal) {
    super();
    this.eid = eid;
    this.ename = ename;
    this.esal = esal;
}

public String getEid() {
    return eid;
}

public String getEname() {
    return ename;
}

public int getEsal() {
    return esal;
}

@Override
public  int compareTo(Object o) {

    Employee obj=(Employee)o;

    if (this.getEsal() < obj.getEsal()){
        return -1;
    }else if (this.getEsal() > obj.getEsal()){
        return 1;
    }else
        return 0;

}

}

现在让我们根据薪资对员工进行排序:

import java.util.Collections; 公共类MainClass {

public static void main(String[] args){

    ArrayList<Employee> al=new ArrayList<Employee>();

    Employee obj=new Employee("e01", "Shan", 222);
    Employee obj1=new Employee("e02", "viv", 600);
    Employee obj2=new Employee("e00", "arun", 100);

    al.add(obj);
    al.add(obj1);
    al.add(obj2);

    Collections.sort(al);

    Iterator i=al.iterator();
    while(i.hasNext()){
        Employee o1=(Employee)i.next();
        System.out.println("Sal: "+o1.getEsal());
    }

}

}

它会给你输出:

Sal: 100
Sal: 222
Sal: 600

我希望你现在得到可比较的逻辑。假设你需要扭转排序模式,那么只需修改如下

 @Override
public  int compareTo(Object o) {

    Employee obj=(Employee)o;

    if (this.getEsal() > obj.getEsal()){
        return -1;
    }else if (this.getEsal() < obj.getEsal()){
        return 1;
    }else
        return 0;

}

并且新输出将是:

Sal: 600
Sal: 222
Sal: 100