2017-07-25 37 views
1

我有我需要排序的字符串列表(請參見下文)。比較和排序具有數字和特殊字符的字符串

  • 「<5公頃」
  • 「> = 10 ha至<20公頃」
  • 「> = 20 ha至<50公頃」
  • 「> = 5 ha至<10公頃」
  • 「> = 50哈」

看起來簡單,但到現在爲止,我沒有找到一個簡單的方法來做到這一點。 Element類只有一個String類型的名爲code的屬性。 Java代碼就在下面,有什麼想法?

public class SortingListComparator { 
     private static List<Element> testList; 

     public static void main(String[] args) { 
     initList(); 
     Collections.sort(testList, new ElementComparator()); 

     for (Element elem : testList) { 
      System.out.println("Code of element : " + elem.getCode()); 
     } 
     } 

    private static void initList() { 
     testList = new ArrayList<Element>(); 

     Element elem1 = new Element("< 5 ha"); 
     Element elem2 = new Element(">= 10 ha to < 20 ha"); 
     Element elem3 = new Element(">= 20 ha to < 50 ha"); 
     Element elem4 = new Element(">= 5 ha to < 10 ha"); 
     Element elem5 = new Element(">= 50 Ha"); 

     testList.add(elem1); 
     testList.add(elem2); 
     testList.add(elem3); 
     testList.add(elem4); 
     testList.add(elem5); 
    } 

    public static class ElementComparator implements Comparator<Element> { 
     @Override 
     public int compare(Element o1, Element o2) { 
      return o1.getCode().compareTo(o2.getCode()); 
     } 
    }  
    } 
+1

首先,我們必須提出規則來定義某個特定記錄是在前一個還是後一個特定記錄之後進行的。 –

+0

字符串「> = 5公頃到<10公頃」的記錄應該在值等於「<5公頃」(位於列表中的第二位) –

回答

0

您可以使用流是這樣的:

testList = testList.stream() 
    .sorted((one,another)->one.getCode().compareTo(another.getCode())) 
    .collect(Collectors.toList()); 
2

真正的答案在這裏:退一步 - 創建有益抽象。

你不應該把你的問題當作「字符串」排序。你看,這些字符串代表區間(或範圍)信息。

含義:雖然它可能看起來像「更多的工作」,你應該考慮建模這些方面。換句話說:

  • 創建表示一個類的(數學)間隔
  • 創建代碼解析像「<5公頃」字符串轉換成的間隔物
  • 然後排序間隔對象

除了創建自己的類,您還可以查看第3方庫,如here所述。

重點是:您的字符串包含非常特別的信息。而良好的面向對象的整個想法是在你的代碼庫中表示這種「最好的方式」。

+0

擊敗我之後。那應該是這樣。或者只是在已經排序好的格式中添加字符串,如果以後不需要重用它,那麼也可以。 – nafas

+0

我不是100%你想說的(我讀過:你會寫出類似的答案)。堅持確定最後一句,雖然;-) – GhostCat

+0

正如你所建議的正確的做法,是通過給它一定的語義(例如<5小於<10等等)對字符串建模。這可能是一項非常困難的任務,但是如果你想要在網頁中顯示某些選項,那麼通過犧牲可重用性來顯示它們可能更容易。 – nafas