2013-05-03 32 views
2

我有一個數組列表如下一些規則排序文本

100 AAA 500-1 Lorem Ipsum 
100 BBB 500-2 Lorem Ipsum 
101 AAA 500-1 Lorem Ipsum 
101 AAA 500-2 Lorem Ipsum 
100 BBB 500-3 Lorem Ipsum 

我想這是歸類爲

101 AAA 500-1 Lorem Ipsum 
101 AAA 500-2 Lorem Ipsum 
100 AAA 500-1 Lorem Ipsum 
100 BBB 500-2 Lorem Ipsum 
100 BBB 500-3 Lorem Ipsum 

首先,通過數(101,100)下降。

二,由三個字母單詞(AAA,BBB)升序。

第三,由升序第三列(500-1,500-2,500-3)

我可以通過空間分割的每個元素,並獲得單詞和排序。但任何人都可以請幫助我以任何其他方式或已知的算法? 如果您需要更多信息,請讓我知道。

預先感謝您。

+0

我不是Java開發人員,但必須有在你的對象一些「排序」功能,它可以或許覆蓋排序取決於多個條件...... – 2013-05-03 12:28:09

+0

有沒有具體的算法爲「本」。任何分類最終都會歸結爲快速排序,泡泡或其他常用的頂級算法之一。它們都依賴於特定的「比較器」功能,儘管它負責指示兩個給定值之間的差異。你所需要做的就是覆蓋它。 – 2013-05-03 12:30:31

+2

你可以爲每一行創建一個對象並使其實現Comparable,並在'compareTo'方法中定義排序(或者像Dworza建議的那樣使用比較器) – 2013-05-03 12:34:44

回答

7

創建Comparator將解決您的問題。 你應該實現這樣的事情:

public class MyComparator implements Comparator<MyObject> {  
    public int compare(MyObject o1, MyObject o2) { 
    if (o1 == null || o2 == null) { 
     throw new NullPointerException(); 
    }  
    if (o1.getValue1() != o2.getValue1()) { 
     return Integer.compare(o1.getValue1(), o2.getValue1()); 
    }  
    return Integer.compare(o1.getValue2(), o2.getValue2()); 
    } 
} 

當然也有更多的方式來解決這個問題,例如,你可以實現自己的排序算法。不過,我認爲使用Comparator是正確的「java-way」來解決它。

+0

這是迄今爲止最好的方法。 – durron597 2013-05-03 12:34:27

+0

@Dworza非常感謝。我現在會嘗試。 – Mahesh 2013-05-03 12:37:16

+0

Np ..如果有什麼不清楚的地方,請不要猶豫,再問一次,如果有什麼不清楚的地方,請不要猶豫,以檢查我的帖子爲答案,如果它能幫助您:) – Dworza 2013-05-03 12:39:33

0

您需要爲此執行Comparator,並將其傳遞給容器的sort()方法。

+0

感謝您的編輯! – Szocske 2013-05-03 13:15:23

2

我假設你有一個CollectionString

我將使用比較器來解決它。

List<String> myCollection = new ArrayList<String>(); 

    Collections.sort(myCollection, new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      // splitting it with space character 
      String[] split1 = o1.split(" "); 
      String[] split2 = o2.split(" "); 

      int i1 = Integer.parseInt(split1[0]); 
      int i2 = Integer.parseInt(split2[0]); 

      int diff = (i2 - i1); 

      if(diff != 0){ // if two integer are equal 
       return diff; 
      }else{ 
       return split2[1].compareTo(split1[1]); 
      } 
     } 
    });