我有一个类"Emp"[String eno, skill; ArrayList<Jobs> Empjobs;]
的对象数组列表。
EmpJobs本身就是班级"Jobs"[String jobId, skill;int priority, TTC;]
的arraylist。
现在在代码中我创建了很少的Emps对象,比如说Emp1, Emp2
,并且他们分配了2个作业作为Jobs类的对象。
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;
}
}
答案 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
。