【问题标题】:How to sort ArrayList<myobject> on the basis of myobject's properties如何根据 myobject 的属性对 ArrayList<myobject> 进行排序
【发布时间】:2012-05-30 14:35:07
【问题描述】:

我想根据对象属性对 ArrayList 中的一些对象进行排序。 对象有:

public class Minterm

{
    String minTerm;
    char flagTick;
    String minTermDerive;
    int groupNo;
    String adjGroup;
    static int MaxLiterals;

然后我在 main 方法中有这个:

ArrayList<Minterm> column =new  ArrayList<Minterm>();

然后我在列表中添加一些Minterm 类型的对象。但最后我想组织它们并在成员变量groupNo(升序)上对它们进行排序。

我搜索并想出了我尝试但没有成功的可比较和比较器接口。有没有其他方法可以做到这一点?还是我做的比较器是错误的。

编辑: 以下是我为 Comparator 编写的代码。请确认是否按升序排序?

package backEnd;

import java.util.Comparator;

public class Comp implements Comparator<Minterm>
{
        @Override
        public int compare(Minterm a, Minterm b) 
        {
            return a.getgroupOne().compareTo(b.getgroupOne());
        }
}

我运行它:

Collections.sort(column , new Comp());

似乎工作正常。但我对它没有很好的理解。 请确认是否按升序排序?

【问题讨论】:

  • 是的,你可能做错了。向我们展示代码,我们会告诉你在哪里。

标签: java sorting collections arraylist


【解决方案1】:

您应该让Minterm 实现Comparable&lt;MinTerm&gt; 或为MinTerm 编写自定义Comparator,然后使用Collections.sort

使用比较器看起来像这样:

Collections.sort(column, new Comparator<Minterm>() {
    @Override
    public int compare(Minterm o1, Minterm o2) {
        return Integer.valueOf(o1.groupNo).compareTo(o2.groupNo);
    }
});

关于您的编辑:

是的。以升序顺序对Minterms 进行排序。

【讨论】:

  • 您应该更喜欢Integer.valueOf() 而不是new Integer(),因为它会缓存常用值。
  • @JBNizet 好吧,从技术上讲,它缓存 -128 和 +127 之间的值,而不是“常见”值,尽管这些是最常见的一般而言
  • @Bohemian:是的,这就是我所说的“普通”。
  • 从 Java 7 开始,您可以直接使用 Integer.compare(int, int),而不是通过 Integer 装箱。
【解决方案2】:

Collections.sort()Comparator 接口正是完成这项工作的正确工具。

应该按照以下几行来做(未经测试):

  Collections.sort(column, new Comparator<Minterm>() {
     public int compare(Minterm o1, Minterm o2) {
       return Integer.valueOf(o1.groupNo).compareTo(o2.groupNo);
     }
  });

【讨论】:

    【解决方案3】:

    两种方式,使用Collections.sort(..)

    • 让你的对象实现Comparable。涉及更改原始类,这可能是不可能的
    • 提供自定义Comparator。它需要您的对象的实例并比较它们。不需要更改课程。

    无论哪种方式,请确保您遵守接口的合同。

    【讨论】:

      【解决方案4】:

      这里是示例代码(更多示例请参考http://java2novice.com/java-collections-and-util/arraylist/sort-comparator/):

      public class MyArrayListSort {
      
          public static void main(String a[]){
      
              List<Empl> list = new ArrayList<Empl>();
              list.add(new Empl("Ram",3000));
              list.add(new Empl("John",6000));
              list.add(new Empl("Crish",2000));
              list.add(new Empl("Tom",2400));
              Collections.sort(list,new MySalaryComp());
              System.out.println("Sorted list entries: ");
              for(Empl e:list){
                  System.out.println(e);
              }
          }
      }
      
      class MySalaryComp implements Comparator<Empl> {
      
          @Override
          public int compare(Empl e1, Empl e2) {
              if(e1.getSalary() < e2.getSalary()){
                  return 1;
              } else {
                  return -1;
              }
          }
      }
      
      class Empl{
      
          private String name;
          private int salary;
      
          public Empl(String n, int s){
              this.name = n;
              this.salary = s;
          }
      
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public int getSalary() {
              return salary;
          }
          public void setSalary(int salary) {
              this.salary = salary;
          }
          public String toString(){
              return "Name: "+this.name+"-- Salary: "+this.salary;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 1970-01-01
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 2017-09-06
        相关资源
        最近更新 更多