Java:对属性

时间:2017-07-07 10:47:26

标签: java sorting arraylist

我有一个类"Emp"[String eno, skill; ArrayList<Jobs> Empjobs;]的对象数组列表。

EmpJobs本身就是班级"Jobs"[String jobId, skill;int priority, TTC;]的arraylist。

现在在代码中我创建了很少的Emps对象,比如说Emp1, Emp2,并且他们分配了2个作业作为Jobs类的对象。

分配到 Emp1

job11,job12 分配到 Emp2

job21, job22

我需要根据他们的工作总数TTC(完成时间)对Emp的Arraylist进行排序。我尝试使用比较器方法,但没有成功。任何帮助将不胜感激。下面是代码片段。

另外,

Emp数组值类似于:'EmpId#Skill'

作业数组值类似于:'skill#priority#TTC#JobId'

我无法解决Collections.sort(emp2,new MyComparator());

class EmpJobsAssign{
    class Emp
    {
    String eno, skill;
    ArrayList<Jobs> Empjobs;
    public Emp(){
        }
    @Override
    public String toString() {
        return ("eno:"+this.eno+
                " skill: "+ this.skill+
                " Job: "+  this.Empjobs);
        }
    }

public class MyComparator implements Comparator<Emp> {
@Override
public int compare(Emp e1, Emp e2) {
    if (e1.Empjobs.TTC > e2.Empjobs.TTC)
     {
         return 1;
     }
    else if (e1.Empjobs.TTC > e2.Empjobs.TTC)
    {
        return -1;
    }
    return 0;    
} 
}

class Jobs
    {
    String jobId, skill;
    int priority, TTC;
    public Jobs(){
     }
     @Override
    public String toString() {
        return ("jobId:"+this.jobId+
                " skill: "+ this.skill +
                " priority: "+ this.priority +
                " TTC: "+ this.TTC);
        }
     }

public static void main(String []args){

        String[] arrayEmp = {"w4#j","w1#c","w2#c","W3#j"}; 
        String[] arrayJob = {"c#3#25#obj1","j#2#20#obj2","j#1#45#obj3","c#4#45#obj4","c#1#15#obj5"}; 
        EmpJobsAssign HW =new EmpJobsAssign();
        EmpJobsAssign.Emp emp=HW.new Emp();
        EmpJobsAssign.Jobs job=HW.new Jobs(); 
        Emp[] emps= HW.SortEmp(arrayEmp,0);
        Jobs[] empjobs=HW.SortJob(arrayJob,1,2);
        int jobindex=0;
        while(jobindex < empjobs.length)
        {
         job=empjobs[jobindex];
            ArrayList<Emp> emp2=new ArrayList<Emp>(); 
             String AssignedFlag="";
            for(int empindex=0;empindex<emps.length;empindex++)
            {
                AssignedFlag="F";
                emp=emps[empindex];
               if(emp.Empjobs == null) {emp.Empjobs=new ArrayList<Jobs>();}
                if(emp.skill.equals(job.skill) && emp.Empjobs.isEmpty()){
                    emp.Empjobs.add(job);
                    System.out.println("empjobs : " +emp);  
                    AssignedFlag="T";
                    System.out.println("Emp2  "+ emp2.size());
                    break;
                }
            }
            System.out.println(" AssignedFlag "+AssignedFlag);
            if(AssignedFlag.equals("F")) {
                Collections.sort(emp2,new MyComparator());
                 System.out.println("Inside If  "+ emp2.get(0));
                Iterator itr=emp2.iterator(); 
                while(itr.hasNext()){
                    System.out.println("test "+ itr.next());
                }
            }
            jobindex++;
        }
        System.out.println("check");
        System.out.println(Arrays.toString(emps));
        System.out.println(Arrays.toString(empjobs)); 
 }

private Emp[] SortEmp(String[] a, int index1)
    {
        Emp[] SortEmp=new Emp[a.length];
        for(int i=0;i<a.length;i++){
            for(int j=i+1;j<a.length;j++){
                if(Integer.parseInt(a[i].substring(1,2))>Integer.parseInt(a[j].substring(1,2))){
                    String temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }
                }
                Emp tempEmp = new Emp();
                tempEmp.eno=a[i].split("#")[0];
                tempEmp.skill=a[i].split("#")[1];
            SortEmp[i]=tempEmp;
        }
        return SortEmp;
    }

    private Jobs[] SortJob(String[] a, int index1, int index2)
    {
        Jobs[] SortJobs=new Jobs[a.length];
        for(int i=0;i<a.length;i++){
            for(int j=i+1;j<a.length;j++){
                if(Integer.parseInt(a[i].split("#")[index1])>Integer.parseInt(a[j].split("#")[index1])){
                    String temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }
                 if(Integer.parseInt(a[i].split("#")[index1])==Integer.parseInt(a[j].split("#")[index1])){
                    if(Integer.parseInt(a[i].split("#")[index2]) > Integer.parseInt(a[j].split("#")[index2])){
                    String temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                    }
                }
                }
                Jobs tempJobs=new Jobs();
                tempJobs.jobId=a[i].split("#")[3];
                tempJobs.skill=a[i].split("#")[0];
                tempJobs.priority=Integer.parseInt(a[i].split("#")[1]);
                tempJobs.TTC=Integer.parseInt(a[i].split("#")[2]);
            SortJobs[i]=tempJobs;
        }
        return SortJobs;
    }
  }

2 个答案:

答案 0 :(得分:3)

如果你不需要,不要放下你自己的比较。

您的比较()归结为:

return Integer.compare(e1.Empjobs.TTC, e2.Empjobs.TTC);

完全消除了原始代码显示时引入此类微妙拼写错误的可能性(您只需执行&lt; b,a b)。

答案 1 :(得分:2)

比较器未正确实现,如果语句具有相同的谓词。

@Override
public int compare(Emp e1, Emp e2) {
    if (e1.Empjobs.TTC > e2.Empjobs.TTC)      // predicate 1
     {
         return 1;
     }
    else if (e1.Empjobs.TTC > e2.Empjobs.TTC) // predicate 2, same as predicate 1
    {
        return -1;
    }
    return 0;    
} 

将第二个谓词更改为e1.Empjobs.TTC < e2.Empjobs.TTC