2016-05-24 86 views
-3
  • 我有一些配方對象列表,包含像季節,地區,類別(所有字符串)排序多個屬性

  • 有一個菜譜,含配方列表不同的屬性。此外,食譜還有一個屬性sortLevelChain(String)。

  • sortLevelChain指定了哪種順序,我想通過將食譜屬性名稱與一個點(例如「Season.Region.Category」)連接來對包含在食譜列表中的食譜進行排序。

現在我需要一個解決方案,如何獲得列表排序的方式,這是由sortLevelChain指定的。我找到了Apaches ComparatorChain,但我不知道如何使用它。每個工作的解決方案是歡迎=)

+0

你在說什麼「動態排序」? –

+0

將字符串拆分爲「。」。然後http://stackoverflow.com/questions/4135998/java-comparator-given-the-name-of-the-property-to-compare –

回答

1

實施是直接forward.Hope下面的示例幫助。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

import org.apache.commons.collections.comparators.ComparatorChain; 

public class ComparatorChainTest { 

    public static void main(String[] args){ 

     ComparatorChain comparatorChain = new ComparatorChain(); 
     String[] filters = "Season.Region.Category".split("."); 
     Comparator comparator = null; 
     for(String filter:filters){ 

      if("season".equalsIgnoreCase(filter)){ 
       comparator = new Comparator<Recipe>() { 
        @Override 
        public int compare(Recipe o1, Recipe o2) { 
         return o1.getSeason().compareTo(o2.getSeason()); 
        } 
       }; 
      } 
      if("region".equalsIgnoreCase(filter)){ 
       comparator = new Comparator<Recipe>() { 
        @Override 
        public int compare(Recipe o1, Recipe o2) { 
         return o1.getRegion().compareTo(o2.getRegion()); 
        } 
       }; 
      } 
      if("category".equalsIgnoreCase(filter)){ 
       comparator = new Comparator<Recipe>() { 
        @Override 
        public int compare(Recipe o1, Recipe o2) { 
         return o1.getCategory().compareTo(o2.getCategory()); 
        } 
       }; 
      } 
      comparatorChain.addComparator(comparator); 
     } 
     List<Recipe> recipes = new ArrayList<Recipe>(); 
     Collections.sort(recipes,comparatorChain); 
    } 

    public class Recipe{ 
     private String season; 
     private String region; 
     private String category; 
     public String getSeason() { 
      return season; 
     } 
     public void setSeason(String season) { 
      this.season = season; 
     } 
     public String getRegion() { 
      return region; 
     } 
     public void setRegion(String region) { 
      this.region = region; 
     } 
     public String getCategory() { 
      return category; 
     } 
     public void setCategory(String category) { 
      this.category = category; 
     } 
    } 
} 
0

這裏有幾種可能性。對於Apache ComparatorChain,請閱讀documentation。您必須爲您希望的每個訂單實施比較器,這裏是SeasonComparator,RegionComparatorCategoryComparator

對於ComparatorChain,實例並添加其他的後一個比較:

ComparatorChain<Recipe> chain = new ComparatorChain<>(); 

for (String elt : sortLevelChain.split("\.")) { 
    if (elt.equals("Season"))  chain.addComparator(new SeasonComparator()); 
    else if (elt.equals("Region")) chain.addComparator(new RegionComparator()); 
    else if (elt.equals("Category")) chain.addComparator(new CategoryComparator()); 
    else throw new IllegalArgumentException("Comparator not supported"); 
} 

Collections.sort(recipeList, chain); 

使用相當簡單,但如果你經常需要這個鏈接的比較,您可以優化該方法。