编辑:我现在感谢大家!
我应该做的是按照降序排列所有员工的总工作时间,如员工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;
}
}
答案 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