сравнить больше полей объекта в CompareTo - PullRequest
2 голосов
/ 13 декабря 2011

Я бы сравнил более одного единственного поля объекта, используя метод compareTo.Возможно ли это?

для istance:

public int compareTo(Object o) {
    return field.compareTo(o.field);
}

Я создаю этот метод для сортировки коллекции.Очевидно, мой объект должен реализовывать Comparable интерфейс.

Я предполагаю, если возможно сравнить не только одно поле в одном методе compareTo.

Ответы [ 7 ]

3 голосов
/ 13 декабря 2011

Да, это возможно, например, так:

public int compareTo(MyClass o){
  int ret = field1.compareTo(o.field1);
  if (ret != 0) return ret;
  ret = field2.compareTo(o.field2);
  if (ret != 0) return ret;
  ...
  return fieldN.compareTo(o.fieldN);
}
3 голосов
/ 13 декабря 2011

Да, это возможно.Если результат сравнения первого поля возвращает ноль, то возвращает результат сравнения второго поля.

public int compareTo(SomeClass o) {
    int result = field1.compareTo(o.field1);
    if ( result == 0 ) {
        result = field2.compareTo(o.field2);
    }
    return result;
}

Это становится довольно громоздким, поэтому Guava предоставляет ComparisonChain.Пример использования:

public int compareTo(SomeClass o) {
    return ComparisonChain.start()
         .compare(field1, o.field1)
         .compare(field2, o.field2)
         .result();
}
0 голосов
/ 13 декабря 2011

Конечно.Вот относительно краткий способ сделать это.

public int compareTo(MyClass other) {
    return
        a!=other.a ? Integer.compare(a, other.a) :
        b!=other.b ? Integer.compare(b, other.b) :
                     Integer.compare(c, other.c);
}

(Integer.compare из Java SE 7, но реализация не сложная. Предполагается, что int fields a, b, c, но, по сути, то же самое для любых типов полей, которые вы можете сравнивать.)

0 голосов
/ 13 декабря 2011

уверен, что можете.однако вы должны определить правило сравнения.

например,

у вас есть

objectA{a=1;b=2;c=3}
objectB{a=20;b=1;c=6}

в вашем compareTo(Object o) методе, вы можете сравнить this.fields с o.fields,Вы даже можете сравнить this.a с o.c, если вам действительно нужно.Дело в том, что вы должны определить правило, в этом случае objectA

0 голосов
/ 13 декабря 2011
public int compareTo(Object o){
  int res = field.compareTo(o.field);
  if(res==0)
    res=field1.compareTo(o.field1);
  return res;
}

должно работать

0 голосов
/ 13 декабря 2011

Вы можете сделать это любым из следующих способов:

public int compareTo(Object o)
{    
    return (field.compareTo(o.field)==1 && field2.compareTo(o.field2)==0)? 0 : 1; 
} 

OR

public int compareTo(Object o)
{
    // add various if-else blocks
    // OR
    // call a separate method    
}
0 голосов
/ 13 декабря 2011

Вы можете, конечно, учитывать другие поля при сравнении, но обычно есть некоторый порядок приоритета, так же, как сортировка в алфавитном порядке смотрит только на вторую букву, если первая совпадает:

public int compareTo(Object o){

   int comparison = field.compareTo(o.field);
   if (comparison != 0)
      return comparison;
   comparison = field2.compareTo(o.field2);
   if (comparison != 0)
      return comparison;
   //etc...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...