how to sort an ArrayList in ascending order using Collections and Comparator

后端 未结 6 787
轮回少年
轮回少年 2020-12-06 07:36

How to sort an ArrayList in ascending order using Comparator? I know how to sort it in descending order using:

Comparator mycompar         


        
相关标签:
6条回答
  • 2020-12-06 08:15

    Use the default version:

    Collections.sort(myarrayList);
    

    Of course this requires that your Elements implement Comparable, but the same holds true for the version you mentioned.

    BTW: you should use generics in your code, that way you get compile-time errors if your class doesn't implement Comparable. And compile-time errors are much better than the runtime errors you'll get otherwise.

    List<MyClass> list = new ArrayList<MyClass>();
    // now fill up the list
    
    // compile error here unless MyClass implements Comparable
    Collections.sort(list); 
    
    0 讨论(0)
  • 2020-12-06 08:15

    Two ways to get this done:

    Collections.sort(myArray)
    

    given elements inside myArray implements Comparable

    Second

    Collections.sort(myArray, new MyArrayElementComparator());
    

    where MyArrayElementComparator is Comparator for elements inside myArray

    0 讨论(0)
  • 2020-12-06 08:23

    Just throwing this out there...Can't you just do:

    Collections.sort(myarrayList);
    

    It's been awhile though...

    0 讨论(0)
  • 2020-12-06 08:25

    Here a complete example :

    Suppose we have a Person class like :

    public class Person
    {
        protected String fname;
        protected String lname;
    
        public Person()
        {
    
        }
    
        public Person(String fname, String lname)
        {
            this.fname = fname;
            this.lname = lname;
        }
    
        public boolean equals(Object objet)
        {
            if(objet instanceof Person)
            {
                Person p = (Person) objet;
                return (p.getFname().equals(this.fname)) && p.getLname().equals(this.lname));
            }
            else return super.equals(objet);
        }
    
        @Override
        public String toString()
        {
            return "Person(fname : " + getFname + ", lname : " + getLname + ")";
        }
    
        /** Getters and Setters **/
    }
    

    Now we create a comparator :

    import java.util.Comparator;
    
    public class ComparePerson implements Comparator<Person>
    {
        @Override
        public int compare(Person p1, Person p2)
        {
            if(p1.getFname().equalsIgnoreCase(p2.getFname()))
            {
                return p1.getLname().compareTo(p2.getLname());
            }
            return p1.getFname().compareTo(p2.getFname());
        }
    }
    

    Finally suppose we have a group of persons :

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    public class Group
    {
        protected List<Person> listPersons;
    
        public Group()
        {
            this.listPersons = new ArrayList<Person>();
        }
    
        public Group(List<Person> listPersons)
        {
            this.listPersons = listPersons;
        }
    
        public void order(boolean asc)
        {
            Comparator<Person> comp = asc ? new ComparePerson() : Collections.reverseOrder(new ComparePerson());
            Collections.sort(this.listPersons, comp);
        }
    
        public void display()
        {
            for(Person p : this.listPersons)
            {
                System.out.println(p);
            }
        }
    
        /** Getters and Setters **/
    }
    

    Now we try this :

    import java.util.ArrayList;
    import java.util.List;
    
    public class App
    {
        public static void main(String[] args)
        {
            Group g = new Group();
            List listPersons = new ArrayList<Person>();
            g.setListPersons(listPersons);
    
            Person p;
    
            p = new Person("A", "B");
            listPersons.add(p);
    
            p = new Person("C", "D");
            listPersons.add(p);
    
            /** you can add Person as many as you want **/
    
            g.display();
    
            g.order(true);
            g.display();
    
            g.order(false);
            g.display();
        }
    }
    
    0 讨论(0)
  • 2020-12-06 08:27

    Sort By Value

      public Map sortByValue(Map map, final boolean ascending) {
                Map result = new LinkedHashMap();
                try {
                    List list = new LinkedList(map.entrySet());
    
                    Collections.sort(list, new Comparator() {
                        @Override
                        public int compare(Object object1, Object object2) {
                            if (ascending)
                                return ((Comparable) ((Map.Entry) (object1)).getValue())
                                        .compareTo(((Map.Entry) (object2)).getValue());
                            else
                                return ((Comparable) ((Map.Entry) (object2)).getValue())
                                        .compareTo(((Map.Entry) (object1)).getValue());
    
                        }
                    });
    
                    for (Iterator it = list.iterator(); it.hasNext();) {
                        Map.Entry entry = (Map.Entry) it.next();
                        result.put(entry.getKey(), entry.getValue());
                    }
    
                } catch (Exception e) {
                    Log.e("Error", e.getMessage());
                }
    
                return result;
            }
    
    0 讨论(0)
  • 2020-12-06 08:31

    This might work?

    Comparator mycomparator = 
        Collections.reverseOrder(Collections.reverseOrder());
    
    0 讨论(0)
提交回复
热议问题