2013-03-04 104 views
0

我想排序對象的數組。每個對象都有getType()方法,它返回String中的對象類型。類型組比較器

我想排序我的數組取決於類似的優先事項。

例子:

Input { A, F, Z, G, E, D, C } 

If(type == A or B or C or D) top 
If(type == E) second 
If(type == F or G) third 
If(differet type) last 

Output: { A, C, D, E, F, G, Z } 

應該如何我比較像?

如果我還沒有明確說明我的問題,請寫下評論,我會盡量簡單說明不清楚的部分。

+0

是'type'一個字符串值 – 2013-03-04 08:57:57

+3

爲什麼你的輸出開始{A,C,D}? {D,A,C}很容易嗎?即您的小組內的所有元素是否有效平等?你有什麼嘗試? – 2013-03-04 08:58:07

+1

你是同一類的所有對象還是至少繼承了同一個接口/類?或者它們都是不同的類(每種類型代表不同的類)? – Dukeling 2013-03-04 09:05:34

回答

3

可以聲明一個優先散列映射:

private static final HashMap<String,Integer> PRIORITIES = new HashMap<String, Integer>(); 
static{ 
    PRIORITIES.put("A", 1); 
    PRIORITIES.put("B", 1); 
    PRIORITIES.put("C", 1); 
    PRIORITIES.put("D", 1); 
    PRIORITIES.put("E", 2); 
    PRIORITIES.put("F", 2); 
    PRIORITIES.put("G", 3); 
} 

然後實現您的Comparatorcompare方法:

private int getPriority(CustomClass obj) { 
    if(obj!=null&&PRIORITIES.containsKey(obj.getType())) { 
     priority1 = PRIORITIES.get(obj.getType()); 
    } else { 
     priority1 = Integer.MAX_VALUE; 
    } 
} 

@Override 
public int compare(CustomClass o1, CustomClass o2) { 
    int priority1,priority2; 
    priority1 = getPriority(o1); 
    priority2 = getPriority(o2); 
    return priority1==priority2 ? 0 : (priority1<priority2 ? -1 : 1); 
} 

UPDATE:清潔的方法是在你的基類來定義的HashMap(其中getType宣佈)並實施getPriority方法:

public int getPriority() { 
    return PRIORITIES.containsKey(getType()) ? PRIORITIES.get(getType()) : Integer.MAX_VALUE; 
} 

然後Comparator是顯而易見的:

@Override 
public int compare(CustomClass o1, CustomClass o2) { 
    int priority1,priority2; 
    priority1 = o1==null ? Integer.MAX_VALUE : o1.getPriority(); 
    priority2 = o2==null ? Integer.MAX_VALUE : o2.getPriority(); 
    return priority1==priority2 ? 0 : (priority1<priority2 ? -1 : 1); 
} 
+1

我發現,您的答案最有用。感謝您花時間查看我的答案並分享您的知識! – Datenshi 2013-03-04 09:44:15

+0

@Dennshi謝謝!祝你好運! – 2013-03-04 09:48:46

1

有你的對象Comparable<ElementType>接口(因爲都是同一類的(可以說ElementType和呼叫Arrays.sort(myArray)。如果要排序的對象,每次使用不同的不同的順序,那麼你應該創建一個Comparator對象

你可以看到很好的例子here

2

我可能會做這樣的事情:

class Comparer implements Comparator<YourType> 
{ 
    @Override 
    public int compare(YourType o1, YourType o2) 
    { 
     return Integer.compare(getRank(o1), getRank(o2)); 
     // Pre-Java 7 
     //Integer v1 = getRank(o1); 
     //return v1.compareTo(getRank(o2)); 
    } 

    int getRank(YourType o) 
    { 
     switch (o.getType()) 
     { 
     case "A": case "B": case "C": case "D": 
      return 1; 
     case "E": 
      return 2; 
     case "F": case "G": 
      return 3; 
     default: 
      return 4; 
     } 
    } 
} 

然後:

YourType[] arr = ...; 
Arrays.sort(arr, new Comparer()); 

以上將只在Java 7和工作,因爲switch上在Java 7之前不支持。

如果您未運行Java 7,則必須使用if語句而不是switch

+0

你的回答是正確的,但我認爲默認的語言環境更好,所以我會接受他的回答。但是,謝謝你的時間和有用的答案,以及:-) – Datenshi 2013-03-04 09:45:13

0

您也可以考慮使用Guava'sOrdering類進行排序輸入你。如果你正在處理的對象有一個「自然」秩序的概念,那麼你可以這樣做Ordering<Input>.natural或實現自己的比較實例化內部:

Ordering<Input> getInputOrder = new Ordering<Input>() { 
public int compare(Input A, Input B) { 
    return A.comparableMember > B.comparableMember 
} 
};