2017-04-21 30 views
0

我將Item對象存儲在ArrayList中。 Item類具有一個名爲field1的浮動字段。我想以field1的遞減順序從itemsList中檢索Item對象。按浮點字段對類對象的ArrayList排序

List<Item> itemsList = new ArrayList<Item>(); 
itemsList.add(new Item(...)); 

這是我的嘗試:

public class Item implements Comparable { 

    //... 

    public float compareTo(Item it) 
    { 
     return(similarity - it.similarity); 
    } 
} 

List<Item> sortedItems = Collections.sort(itemsList); 

的問題是,compareTo應該返回int,而我有float。那麼,我應該採用哪種方法對float值進行排序?

+0

您是否嘗試將float轉換爲int?使用'Math.round()' –

+0

請參閱此鏈接:https://www.tutorialspoint.com/java/util/arrays_sort_float.htm – Marievi

+1

如果你這樣做,然後漂浮到相同的數字將被視爲等於 – Ishnark

回答

1

方法簽名應該是:

public int compareTo(Item it) 

而不是返回float。目前你沒有實現接口Comparable

最簡單的實現是:

public int compareTo(Item it) { 
    return Float.compare(similarity, it.similarity); 
} 
+0

如果是public int compareTo(Item it){ return Float.compare(similarity,it.similarity); }',我得到錯誤'方法不覆蓋...'。 – Dinosaurius

+0

哈是的,你已經刪除了可比較的通用位。將你的類改爲'public class Item implements Comparable ',它應該可以正常工作。 – assylias

0

campareTo()確切的返回值並不重要。它可以低於0,恰好爲0或大於0.例如,對於每個低於0的差值,您可以返回-1,對於每個大於0的差值,1和最後0爲0.

由於Float已經可比較這很容易:similarity.compareTo(it.similarity)

0

compareTo假設只返回3個可能的值。 1,0,-1。 1表示該對象比正在比較的要大,0表示它們相等,-1表示該對象比它所比較的​​要小。所以你的compareTo方法應該很簡單。

public int compareTo(Item it) 
    { 
     if(this.field1 < it.getField1()) { 
      return -1; 
     } 
     else if(this.field1 > it.getField1()) { 
      return 1; 
     } 
     else { 
     return 0; 
     } 
    } 
+0

我不能分配'@ Override',而類實現了Comparable。 – Dinosaurius

+0

你在說什麼? – victor

+1

@victor'compareTo'可以返回它想要的任何'int',而不僅僅是-1,0和1. – assylias