按类字段对java中的数组进行排序

时间:2011-12-09 22:34:31

标签: java arrays sorting

有人可以帮我解决java中的以下问题吗?我有一个简单的类定义如下:

public class Expr {
  public long total_apparitions;
  public String expression=new String();

  public Expr(long total,String expr){
    this.total_apparitions=total;
    this.expression=expr;
  }

  public void increment(long aparitions){
    total_apparitions+=aparitions;
  }
}

我想使用Expr内置函数按total_apparitions字段对Arrays.sort个对象进行排序。如何为Arrays.sort函数指定比较因子?非常感谢。

3 个答案:

答案 0 :(得分:5)

正如@Jason Braucht所说,像这样实施Comparable

public class Expr implements Comparable {
  ...
  public int compareTo(Object o) {
    if(this.total_apparitions > ((Expr) o).total_apparitions)
      return 1;
    else if(this.total_apparitions < ((Expr) o).total_apparitions)
      return -1;
    return 0;
  }
}

答案 1 :(得分:4)

Expr实施java.lang.Comparable

编辑 - 应该提供一个示例(其他人已经提供过)。这是使用泛型的完整示例。

public class Expr implements Comparable<Expr>
{

    public long total_apparitions;
    public String expression = new String();

    public Expr(long total, String expr)
    {
        this.total_apparitions = total;
        this.expression = expr;

    }

    public void increment(long aparitions)
    {
        total_apparitions += aparitions;
    }

    public int compareTo(Expr o)
    {
        if (total_apparitions > o.total_apparitions)
        {
            return 1;
        }
        else if (total_apparitions < o.total_apparitions)
        {
            return -1;
        }
        else
        {
            return 0;
        }
    }
}

答案 2 :(得分:3)

作为实施Comparable的替代方法,您可以将Comparator实例传递给Arrays.sort()方法。这样做的好处是,它允许你有不同的概念来排序这种类型的对象数组(比如你可能希望稍后按名称排序,在这种情况下你只需要一个不同的比较器实现)

例如:

public class ByApparationsComparator implements Comparator<Expr> {
  public int compare(Expr first, Expr second) {
    if (first.total_apparitions > second.total_apparitions) {
      return 1;
    } else if (first.total_apparitions < second.total_apparitions) {
      return -1;
    } else {
      return 0;
    }
  }
}

然后你可以说:

Arrays.sort(exprArray, new ByApparationsComparator());