Reputation: 367
I want to sort a list of array using Collections.sort() based to the CompareTo() method
This is my arraylist object :
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);
This is my compareTo function :
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;
}
Now when I want to call
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;
}
The Personne object is defined as
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;
}
}
The problem is in the line Collections.sort(listPersonnes);
saying
The method sort(List) in the type Collections is not applicable for the arguments (ArrayList)
Is not this weird please ?
Upvotes: 1
Views: 98
Reputation: 40008
You need to implement Comparable
interface on Personne
for overriding the compareTo
logic or from java-8 you can use lambda expression for custom comparator
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;
};
And also you can use ArrayList
sort method
listPersonnes.sort(c);
Upvotes: 0
Reputation: 1327
Try adding Comparable
in your Personne class, this way :
public class Personne implements java.lang.Comparable<Personne>
{ ... }
Also, as suggested in a comment, your compareTo()
method needs to be inside your Personne class.
Alternative:
you can do in this way (add your compareTo
method in Comparator's compare
method) :
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;
}
});
Upvotes: 2