Сортировка таблиц с двумя элементами - PullRequest
0 голосов
/ 08 апреля 2010

Я хочу сделать сортировку на Java.В моем объекте у меня много элементов, поэтому я хочу сделать сортировку по мощности и модели:

public class Product implements Comparable<Product>,Serializable
{   
private int idProduct ;
private int power;
private String model;
private String  color;
[...]
@Override
    public int compareTo(Product o) {
        return String.valueOf(this.power).compareTo(String.valueOf(o.power));

    }

Так как сделать сортировку по мощности и модели?

Ответы [ 4 ]

1 голос
/ 08 апреля 2010

Вам нужно решить, какая из них сортируется первой, а какая - второй.Как только вы решите, вы просто реализуете метод compareTo следующим образом:

@Override
public int compareTo(Product o) {
    int result = this.model.compareTo(o.model);
    if (result == 0)
        return String.valueOf(this.power).compareTo(String.valueOf(o.power));
    else
        return result;
}

Или, если вы не хотите изменять метод compareTo, вы можете написать свой собственный Comparator вот так:

public class ProductComparator implements Comparator<Product> {
    public int compare(Product p1, Product p2) {
        int result = p1.model.compareTo(p2.model);
        if (result == 0)
            return String.valueOf(p1.power).compareTo(String.valueOf(p2.power));
        else
            return result;
    }
}
1 голос
/ 08 апреля 2010

Следующее сначала будет отсортировано по power, а в случае связи будет отсортировано по model:

public int compareTo(Product that) {
  if(this.power != that.power) {
    return this.power < that.power ? -1 : 1;
  } 
  else {
    return this.model.compareTo(that.model);
  }
}

Или, если вам нужно сравнить power лексикографически, выполните:

public int compareTo(Product that) {
  if(this.power != that.power) {
    return String.valueOf(this.power).compareTo(String.valueOf(that.power));
  } 
  else {
    return this.model.compareTo(that.model);
  }
}
0 голосов
/ 08 апреля 2010

Некоторые дополнительные очки:

1) Нет необходимости преобразовывать мощность в String, чтобы сравнить ее. Вы можете сделать целочисленное сравнение:

int result = this.power - o.power;
if (result == 0) {
  result = this.model.compareTo(o.model);
}

Обратите внимание, что в этом случае порядок сортировки будет отличаться от сравнения на основе строк , хотя (например, "200"> "10000", тогда как 200 <10000). </p>

2) Вы можете дополнительно оптимизировать свой метод compareTo, проверив, сравнивается ли объект с самим собой:

public int compareTo(Product that) {
  int ret;

  if (this == that) { // Object is being compared against itself.
    ret = 0;
  } else {
    // Do full comparison.
  }

  return ret;
}

3) От компаратора Javadoc:

При использовании следует соблюдать осторожность компаратор, способный навязать порядок несовместим с равно заказать отсортированный набор (или отсортированную карту).

Ваш метод сравнения основан только на мощности и модели, тогда как равенство будет основываться на идентичности объекта, если вы не переопределите метод equals. Следовательно, вы можете рассмотреть возможность переопределения equalshashCode), чтобы привести их в соответствие с compareTo.

0 голосов
/ 08 апреля 2010

CompareTo должно возвращать -1, когда это меньше o , 0, когда они равны, и 1, когда это больше o .

Предположительно, вы собираетесь использовать модель для сортировки предметов с одинаковой силой, поэтому вы должны сделать что-то вроде:

int powerDiff=String.valueOf(this.power).compareTo(String.valueOf(o.power));  
if(powerDiff==0)  
  return String.valueOf(this.model).compareTo(String.valueOf(o.model));  
return powerDiff;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...