2016-01-23 100 views
1

我有一個矢量的對象。每個對象有三個字段 -如何通過Java中的多個字段來排序對象?

我需要排列這個對象列表,以便它們按這些值遞增。我的意思是,v1是先排序的,然後如果v1在任何對象中都是相同的,那麼v2是有序的,如果v2是相同的,v3是有序的 - 當你按字母順序排列單詞時,首先命令第一個字符第二個等等。

我知道我想說可能聽起來令人困惑,請告訴我,如果我需要重新措辭

因此我需要讓我的輸入:

object 1: v1 = 5, v2 = 6, v3 = 1; 
object 2: v1 = 7, v2 = 5, v3 = 3; 
object 3: v1 = 5, v2 = 1, v3 = 3; 
object 4: v1 = 2, v2 = 5, v3 = 5; 
object 5: v1 = 8, v2 = 4, v3 = 6; 

像這樣訂購:

object 4: v1 = 2, v2 = 5, v3 = 5; 
object 3: v1 = 5, v2 = 1, v3 = 3; 
object 1: v1 = 5, v2 = 6, v3 = 1; 
object 2: v1 = 7, v2 = 5, v3 = 3; 
object 5: v1 = 8, v2 = 4, v3 = 6; 

正如你所看到的物體3和1具有相同的V1,因此將被責令V2

請告訴我,如果我需要進一步制定

+0

您可能希望你的類實現「可比」接口: 看到這個SO螺紋: http://stackoverflow.com/questions/3718383/java-class-implements-comparable – Liang

+0

所以,你必須實現['Comparable'](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)接口,然後調用內置['sort'](https: //docs.oracle.com/javase/tutorial/collections/interfaces/order.html)方法。有什麼問題? – soon

+0

虐待只是嘗試一下,感謝您的快速反應 – John

回答

1

使用a Sort - 用Comparable (on the type) or with a separate Comparator。這些在別處介紹

的「棘手」位是寫比較方法不太痛苦。這可以以下的幾個模板之一來完成(在僞代碼中,compareTo方法是將被寫爲適當,使得它跟隨可比/比較合同):

// Objects supplied to comparing function 
Vector a = .. 
Vector b = .. 

// First component in which the values are not equals 
// establishes a 'winner' 
int cmp = 0; 
if ((cmp = compareTo(a.v1, b.v1)) != 0) return cmp; 
if ((cmp = compareTo(a.v2, b.v2)) != 0) return cmp; 
if ((cmp = compareTo(a.v3, b.v3)) != 0) return cmp; 
return 0; 

有,當然,多種變化包括顯式/嵌套if結構和三元條件鏈。上面的代碼是以顯示比較單個元素和一致性/可擴展性的單一評估的方式編寫的。

對於數字,注意溢出並且結果可能不是整數等,compareTo(n1, n2)有時表示爲n1 - n2。如果向量中的值是浮點數,則在進行比較時,可能值得考慮epsilon


這裏是邏輯的另一可視化:

if (a.v1 < b.v1) return -1; 
else if (a.v1 > b.v1) return 1; 
else 
    if (a.v2 < b.v2) return -1; 
    else if (a.v2 > b.v2) return 1; 
    else 
    if (a.v3 < b.v3) return -1; 
    else if (a.v3 > b.v3) return 1; 
    else 
     return 0; 
+0

這種方法很有用,謝謝 – John

0

,你可以實現你的類可比_對象

public int compareTo(final ObjectX 2bj1, final ObjectX obj2) { 
...  
} 
+0

當然,但我不認爲這本身就涵蓋了OP的要求。類似於http://stackoverflow.com/a/3718515/2864740中所示的2軸順序(可輕鬆擴展到4軸)將是相關的。 – user2864740

1

使用以下代碼進行排序任何數量和排序的任何水平。

import java.util.*; 

public class SortObj implements Comparable{ 

    int v1=0, v2=0, v3=0; 

    public SortObj(int v1, int v2, int v3) { 
     this.v1 = v1; 
     this.v2 = v2; 
     this.v3 = v3; 
    } 

    public static void main(String[] args) { 
     SortObj o1 = new SortObj(1,2,3); 
     SortObj o2 = new SortObj(1,4,3); 
     SortObj o3 = new SortObj(1,50,3); 
     SortObj o4 = new SortObj(1,30,30); 
     SortObj o5 = new SortObj(2,20,3); 
     SortObj o6 = new SortObj(3,20,3); 

     List<SortObj> list = new ArrayList<>(); 
     list.add(o1); 
     list.add(o2); 
     list.add(o3); 
     list.add(o4); 
     list.add(o5); 
     list.add(o6); 

     Collections.sort(list); 
     for(SortObj sortObj : list){ 
      System.out.println(sortObj.toString()); 
     } 
    } 


    @Override 
    public String toString() { 
     return String.format("%02d", v1)+ 
       String.format("%02d", v2)+ 
       String.format("%02d", v3); 
    } 
    @Override 
    public int compareTo(Object o) { 
     return this.toString().compareTo(o.toString()); 
    } 
} 
+0

String.format的這種用法很聰明,但有一些缺點需要指出。上述代碼只有在所有組件值都在[0..99。範圍內)時才能保證工作。超出此範圍的值(包括負數)將產生意外結果。 – user2864740

+0

是的,但是這是一種線索,我們可以推廣和驗證自定義,即String.format與自定義級別的格式到第n個數字填充。 –

+0

即使使用任意(但經過精心選擇)的填充級別,當引入負數時,字符串方法也會失敗:「-1」在*「-2」之前排序*,儘管數量較大。 – user2864740

相關問題