2017-07-07 127 views
2

我有一个类对象的数组列表"Emp"[String eno, skill; ArrayList<Jobs> Empjobs;]Java:属性上的对象排序Arraylist

EmpJob本身是类"Jobs"[String jobId, skill;int priority, TTC;]的阵列列表。

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

job11,job12分配给EMP1

job21, job22分配给EMP2

我需要根据总他们的工作TTC(时间Completeion)的排序的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

无关:阅读有关Java命名约定。你的名字很抱歉,奇怪。变量camelCase(总是)。另外:不要缩写,尤其是类名(比如'Emp' - 简单可怕)。 – GhostCat

+0

感谢您的反馈Ghostcat。那么这是我第一个专业的java代码。我会研究你的反馈。 – Sumit

+2

不要误解我的意思,但是这段代码与“专业”距离数十亿英里。我希望你只是表示这就像你第一次用java解决任务的“真正”尝试。 – GhostCat

回答

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

+0

下面的错误是看到compilaton: HelloWorld.java:23:错误:无法找到符号,如果(e1.Empjobs.TTC> e2.Empjobs.TTC) 符号:变量TTC – Sumit

3

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

你的比较()归结为:

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

完全消除引入这样细微的拼写错误作为您的原始代码的机会是说明(在这里你只是做了一个< B,A-B)。

+0

下面的错误是看到compilaton: 的HelloWorld。 java:23:错误:找不到符号if(e1.Empjobs.TTC> e2.Empjobs。TTC) 符号:变量TTC – Sumit

+3

我只是** **在这里复制你的代码。我告诉你:当你有** 2 ** int值时,你不需要比较自己,你可以使用Integer.compare(a,b)来比较它们。当你现在发现你自己的代码e1.empjobs.TTC是无效的。这是*你的*代码。 – GhostCat