簡體   English   中英

在compareTo中比較對象的更多字段

[英]compare more field of a object in compareTo

我將使用compareTo方法比較一個對象的多個字段。 可能嗎?

出於目的:

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

我創建此方法來對集合進行排序。 顯然,我的對象必須實現Comparable接口。

我猜測是否有可能在同一方法compareTo不只比較一個字段。

是的,有可能。 如果第一個字段的比較結果返回零,則返回第二個字段的比較結果。

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

這得到繁瑣的相當快,這就是為什么番石榴提供ComparisonChain 使用示例:

public int compareTo(SomeClass o) {
    return ComparisonChain.start()
         .compare(field1, o.field1)
         .compare(field2, o.field2)
         .result();
}

是的,有可能這樣,例如:

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);
}

進行比較時,您當然可以考慮其他字段,但是通常有一些優先順序,就像按字母順序排序時,如果第一個字母相同,則只看第二個字母:

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...
}
public int compareTo(Object o){
  int res = field.compareTo(o.field);
  if(res==0)
    res=field1.compareTo(o.field1);
  return res;
}

應該管用

你當然可以。 但是,您必須定義比較規則。

例如

你有

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

compareTo(Object o)方法中,可以將this.fieldso.fields進行比較。 如果確實需要,您甚至可以將this.aoc進行比較。 關鍵是您必須定義規則,在這種情況下,objectA <objectB。 等等..

當然。 這是一種相對簡潔的方法。

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字段abc ,但是對於您可以比較的任何字段類型基本上都是相同的。)

您可以通過以下任何一種方式來做到這一點:

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

要么

public int compareTo(Object o)
{
    // add various if-else blocks
    // OR
    // call a separate method    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM