SA2018
SA2018

Reputation: 367

Why sort method doesn't work for arraylist object

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

Answers (2)

Ryuzaki L
Ryuzaki L

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

Shrey Garg
Shrey Garg

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

Related Questions