1

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 ?

2
  • 1
    try implementing Comparable in your Personne class Commented Jul 25, 2019 at 6:57
  • 1
    Where are you implementing that compareTo? It seems to be outside Personne so how is the call to Collections.sort able to access it? You may want to call the overload Collections#sort(Collection<E>, Comparator<E>) Commented Jul 25, 2019 at 6:58

2 Answers 2

2

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;
        }
    });
Sign up to request clarification or add additional context in comments.

Comments

0

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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.