我想使用基于CompareTo()方法的Collections.sort()对数组列表进行排序
这是我的arraylist对象:
ArrayList<Personne> personnes = new ArrayList<Personne>();
Personne p1 = new Personne("001590842","51862499", "N5+", "1", "20170201","0");
Personne p2 = new Personne("001590842","51862499", "X0", "1", "20150529", "1");
Personne p3 = new Personne("001639055","51862517", "G3", "1", "20170201", "2");
Personne p4 = new Personne("001639055","51862517", "G3", "1", "20170201", "2");
Personne p5 = new Personne("001597135","51862517", "G3", "1", "20170201", "2");
Personne p6 = new Personne("001597135","51862517", "G3", "1", "20170201", "2");
Personne p7 = new Personne("002804935","00006178","G4","1","19870101","1");
Personne p8 = new Personne("002804935","00009118","X0","1","19861201","1");
Personne p9 = new Personne("002804935","00009957","N4+","1","19861229","1");
Personne p10 = new Personne("002804935","00012970","B3++","1","20100227","1");
personnes.add(p1);
personnes.add(p2);
personnes.add(p3);
personnes.add(p4);
personnes.add(p5);
personnes.add(p6);
personnes.add(p7);
personnes.add(p8);
personnes.add(p9);
personnes.add(p10);
这是我的compareTo函数:
public int compareTo(Object personne) {
int res = 0;
Personne other = (Personne) personne;
// Conversion of Dates from String to Dates
Date otherDate = converteDate(other.getDA_PRM_CTR_ORDER());
Date entreePersonne = converteDate(this.DA_PRM_CTR_ORDER);
res = entreePersonne.compareTo(otherDate);
// if there is Legality between dates
if (res == 0) {
Long entreePersonneIDT = Long.parseLong(this.getIDT_ETT_PSE());
Long otherPersonneIDT = Long.parseLong(other.getIDT_ETT_PSE());
res = entreePersonneIDT.compareTo(otherPersonneIDT);
return res;
}
return res;
}
现在我想打电话
private static String SelectionCodeNote(ArrayList<Personne> listPersonnes) {
if (null != listPersonnes) {
for(Personne personne: listPersonnes)
{
if (personne.getIDC_PSE_PCL().equals("1") && personne.getIDC_CD_NOT().equals("0")) {
return (personne.getCD_NOT());
} else {
Collections.sort(listPersonnes);
return (personne.getCD_NOT());
}
}
}return null;
}
Personne对象定义为
public class Personne {
private String IDT_GCT;
private String IDC_PSE_PCL;
private String IDC_CD_NOT;
private String DA_PRM_CTR_ORDER;
private String IDT_ETT_PSE;
private String CD_NOT;
public Personne(String IDT_GCT, String IDC_PSE_PCL, String IDC_CD_NOT,
String DA_PRM_CTR_ORDER, String IDT_ETT_PSE, String CD_NOT) {
this.IDT_GCT = IDT_GCT;
this.IDC_PSE_PCL = IDC_PSE_PCL;
this.IDC_CD_NOT = IDC_CD_NOT;
this.DA_PRM_CTR_ORDER = DA_PRM_CTR_ORDER;
this.IDT_ETT_PSE = IDT_ETT_PSE;
this.CD_NOT = CD_NOT;
}
public String getIDC_CD_NOT() {
return this.IDC_CD_NOT;
}
public String getIDC_PSE_PCL() {
return this.IDC_PSE_PCL;
}
public String getDA_PRM_CTR_ORDER() {
return this.DA_PRM_CTR_ORDER;
}
public String getIDT_ETT_PSE() {
return this.IDT_ETT_PSE;
}
public String getCD_NOT() {
return this.CD_NOT;
}
public String getIDT_GCT() {
return this.IDT_GCT;
}
}
问题出在Collections.sort(listPersonnes);
说
Collections类型中的sort(List)方法不适用于 参数(ArrayList)
这不是很奇怪吗?
答案 0 :(得分:2)
尝试通过以下方式在您的Personne类中添加Comparable
:
public class Personne implements java.lang.Comparable<Personne>
{ ... }
另外,如注释中所建议,您的compareTo()
方法必须位于Personne类内。
替代:
您可以通过这种方式进行操作(在比较器的compareTo
方法中添加compare
方法):
Collections.sort(personnes, new Comparator<Personne>() {
@Override
public int compare(Personne o1, Personne o2) {
int res = 0;
Personne other = (Personne) personne;
// Conversion of Dates from String to Dates
Date otherDate = converteDate(other.getDA_PRM_CTR_ORDER());
Date entreePersonne = converteDate(this.DA_PRM_CTR_ORDER);
res = entreePersonne.compareTo(otherDate);
// if there is Legality between dates
if (res == 0) {
Long entreePersonneIDT = Long.parseLong(this.getIDT_ETT_PSE());
Long otherPersonneIDT = Long.parseLong(other.getIDT_ETT_PSE());
res = entreePersonneIDT.compareTo(otherPersonneIDT);
return res;
}
return res;
}
});
答案 1 :(得分:0)
您需要在Comparable
上实现Personne
接口以覆盖compareTo
逻辑,或者从Java-8开始,您可以将lambda表达式用于自定义比较器
Comparator<Personne> c = (p1,p2)-> {
int res = 0;
// Conversion of Dates from String to Dates
Date otherDate = converteDate(p1.getDA_PRM_CTR_ORDER());
Date entreePersonne = converteDate(p2.DA_PRM_CTR_ORDER);
res = entreePersonne.compareTo(otherDate);
// if there is Legality between dates
if (res == 0) {
Long entreePersonneIDT = Long.parseLong(p1.getIDT_ETT_PSE());
Long otherPersonneIDT = Long.parseLong(p2.getIDT_ETT_PSE());
res = entreePersonneIDT.compareTo(otherPersonneIDT);
return res;
}
return res;
};
您也可以使用ArrayList
sort方法
listPersonnes.sort(c);