【问题标题】:how to sort an ArrayList in ascending order using Collections and Comparator如何使用集合和比较器按升序对 ArrayList 进行排序
【发布时间】:2012-01-21 08:58:23
【问题描述】:

如何使用ComparatorArrayList 进行升序排序?我知道如何使用降序对其进行排序:

Comparator mycomparator = Collections.reverseOrder();

然后

Collections.sort(myarrayList,mycomparator);

只想知道如何使用集合和比较器按升序对其进行排序?谢谢!

【问题讨论】:

  • 你搜索过论坛吗?这个问题每天被问一次。

标签: java sorting collections comparator


【解决方案1】:

这可能有用吗?

Comparator mycomparator = 
    Collections.reverseOrder(Collections.reverseOrder());

【讨论】:

    【解决方案2】:

    按值排序

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

    【讨论】:

      【解决方案3】:

      这里有一个完整的例子:

      假设我们有一个像这样的 Person 类:

      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 **/
      }
      

      现在我们创建一个比较器:

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

      最后假设我们有一群人:

      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 **/
      }
      

      现在我们试试这个:

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

      【讨论】:

        【解决方案4】:

        完成此任务的两种方法:

        Collections.sort(myArray)
        

        myArray 中的给定元素实现 Comparable

        第二

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

        对于 myArray 中的元素,MyArrayElementComparatorComparator

        【讨论】:

          【解决方案5】:

          把这个扔出去......你不能这样做吗:

          Collections.sort(myarrayList);
          

          虽然已经有一段时间了......

          【讨论】:

          • 谢谢,只是想知道可以定义一个比较器吗?
          【解决方案6】:

          使用默认版本:

          Collections.sort(myarrayList);
          

          当然,这要求您的 Elements 实现 Comparable,但您提到的版本也是如此。

          顺便说一句:您应该在代码中使用泛型,这样如果您的类没有实现 Comparable,就会出现编译时错误。而且编译时错误比运行时错误要好得多。

          List<MyClass> list = new ArrayList<MyClass>();
          // now fill up the list
          
          // compile error here unless MyClass implements Comparable
          Collections.sort(list); 
          

          【讨论】:

          • 谢谢,只是想知道可以定义一个比较器吗?
          • @user1097097 是的,阅读Object Ordering tutorial,它解释了比较器
          猜你喜欢
          • 1970-01-01
          • 2018-11-25
          • 1970-01-01
          • 2014-04-14
          • 2023-04-06
          • 2020-05-17
          • 1970-01-01
          相关资源
          最近更新 更多