2017-07-07 85 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