Сортировать массив в Java, по полю класса - PullRequest
0 голосов
/ 10 декабря 2011

Может кто-нибудь, пожалуйста, помогите мне со следующей проблемой в 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 ]

5 голосов
/ 10 декабря 2011

Как сказал @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;
  }
}
4 голосов
/ 10 декабря 2011

Сделать 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;
        }
    }
}
3 голосов
/ 10 декабря 2011

В качестве альтернативы реализации 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...