2012-01-30 63 views
1

我有一個簡單的Java POJO,看起來像這樣:有道雙向排序

class MyClass 
{ 
    public String getGroup(); 
    public String getTitle(); 
} 

現在我想要做的是首先一個排序由返回值MyClass的POJO的列表getTitle()方法。儘管使用我自己的比較器很容易。但是,我想要的是由getGroup()返回的值相同的實例相互跟隨。現在我所做的就是像

.. compare(MyClass c1, MyClass c2) 
{ 
    if (c1.getGroup().compareTo(c2.getGroup()) == 0) 
    { 
    return c1.getTitle().compareTo(c2.getTitle()); 
    } 
    return c1.getGroup().compareTo(c2.getGroup()); 
} 

然而,這段代碼的問題是,它不再是主要由標題排序,因爲我第一次比較組,沒有標題的內容,這樣一組從「B」開始,將以「C」開頭,然後以「C」開頭,儘管其標題可能會先出現。以主題排序的主要方式是什麼,但確保組也是「組合」在一起的?

的樣本數據:

MyClass 1 (group = "A", title="5") 
MyClass 2 (group = "B", title="9") 
MyClass 3 (group = "B", title="1") 

用我以前的代碼將在

MyClass 1 (group = "A", title="5") 
MyClass 3 (group = "B", title="1") 
MyClass 2 (group = "B", title="9") 

結束 - >排序組,然後按標題排序

但我想

MyClass 3 (group = "B", title="1") 
MyClass 2 (group = "B", title="9") 
MyClass 1 (group = "A", title="5") 

- > sor牛逼的稱號,但要確保每個等於組如下彼此,這就是爲什麼仍然MyClass的1標題爲「5」 MyClass的2標題爲「9」後,來... ...

+1

目前尚不清楚你想要什麼。它必須* *主要按標題排序*或*主要按組排序。請提供一些示例數據以及您希望輸出的樣子。 – 2012-01-30 13:17:01

+0

「組」和「標題」之間是否有任何邏輯關係? – UmNyobe 2012-01-30 13:40:00

+0

不是沒有。標題是爲了排序,組是爲了保持秩序(標題後) – anderswelt 2012-01-30 13:44:56

回答

0

無法用比較器完成。您需要遍歷已排序的標題,然後爲每個未訪問的標題排序相應的組。以下是一些示例代碼,它們可以像您想要的那樣排序。

public class MyClass { 
    private String group; 
    private String title; 

    public MyClass(String g, String t) { 
     group=g; 
     title=t; 
    } 

    static Comparator<MyClass> TITLE_COMPARATOR = 
      new Comparator<MyClass>() { 
        @Override 
        public int compare(MyClass c1, MyClass c2) { 
          return c1.title.compareTo(c2.title); 
        } 
      }; 
    static Comparator<MyClass> GROUP_COMPARATOR = new Comparator<MyClass>() { 
        @Override 
        public int compare(MyClass c1, MyClass c2) { 
          return c1.group.compareTo(c2.group); 
        } 
      }; 

    public static List<MyClass> sublist(List<MyClass> list, String group) { 
      ArrayList<MyClass> ret = new ArrayList<MyClass>(); 
      for (MyClass mc : list) 
       if (mc.group.equals(group)) 
        ret.add(mc); 
      return ret; 
     } 

public static void main(String[] argv) { 
    ArrayList<MyClass> sorted = new ArrayList<MyClass>(); 

    ArrayList<MyClass> list = new ArrayList<MyClass>(); 
    list.add(new MyClass("A", "5")); 
    list.add(new MyClass("B", "9")); 
    list.add(new MyClass("B", "1")); 
    Collections.sort(list, TITLE_COMPARATOR); 
    Hashtable<String, Boolean> visited = new Hashtable<String, Boolean>(); 
    for (MyClass mc : list) { 
     if (visited.get(mc.group) == null) { 
      List<MyClass> sublist = sublist(list, mc.group); 
      Collections.sort(sublist, GROUP_COMPARATOR); 
      sorted.addAll(sublist); 
      visited.put(mc.group, Boolean.TRUE); 
     } 
    } 

    for (MyClass mc : sorted) 
     System.out.println(mc.group + " " + mc.title); 
} 

}

1

什麼是正確的方法主要是按標題排序,但確保團體也一起「分組」在一起?

要按標題和然後按組,只需在您的比較器開關getGroup()getTitle()無處不在。

這是一種替代,簡化版本:

int compare(MyClass c1, MyClass c2) 
{ 
    int cmp = c1.getTitle().compareTo(c2.getTitle()); 
    if (cmp == 0) { 
    cmp = c1.getGroup().compareTo(c2.getGroup()); 
    } 
    return cmp; 
} 

如果這不是你正在努力實現的,請說明你的要求是什麼。

+0

我不認爲這就是他想要的 – Bohemian 2012-01-30 13:19:47

0

你的問題沒有道理:「分組在一起」是指按組排序先,然後按標題

有沒有得到解決它。

我認爲你真的想要你已經編碼。

0

嘗試在比較器中使用.getGroup而不是.getTitle(反之亦然)。我想你應該做你正在做的事情。