2017-04-13 43 views
0

比方說,我有一個列表:List元素取決於複雜的條件下訂購

unordered_list = ['c-1','a-2','a-4','b-2','a-1','b-3','c-3','c-4'] 

而且我有一些條件:應附加

  1. 3結束第一要素(但爲了從a到c應該保留)
  2. 然後列表應該從a到c排列
  3. 但是當從a到c排序時,結尾必須從1到3排序

結果應該是這樣的:

ordered_list = ['b-3','c-3','a-1','a-2','a-4','b-2','c-1','c-4'] 

我花了很多時間去尋找一些有效的方式實現它Groovy中,但沒有成功,因爲我在初學它。 任何提示將不勝感激。提前致謝!

+0

什麼是字符串格式另一種方式?他們總是3字符長 –

+0

@WillemVanOnsem,不,他們實際上看起來像「 - 」,其中gitreponame包含2或3個單詞分隔。 – Olia

回答

2

無需其他所有的名單,你可以直接流式陣列

Stream.concat(Stream.of(unordered_list) 
        .filter(s -> s.endsWith("3")) 
        .sorted(), 
      Stream.of(unordered_list)) 
      .filter(s -> !s.endsWith("3")) 
      .sorted() 
      .collect(toList()); 

或fo [R實際列表:

List<String> unorderedList = asList("c-1", "a-2", "a-4", "b-2", "a-1", "b-3", "c-3", "c-4"); 
    Stream.concat(unorderedList.stream() 
        .filter(s -> s.endsWith("3")) 
        .sorted(), 
      unorderedList.stream() 
        .filter(s1 -> !s1.endsWith("3")) 
        .sorted()) 
      .collect(toList()); 

最後,使用分區

Map<Boolean, List<String>> endsWith3Partition = Stream.of(unordered_list) 
      .sorted() 
      .collect(partitioningBy(s -> s.endsWith("3"))); 
    List<String> sorted = new ArrayList<>(unordered.length); 
    sorted.addAll(endsWith3Partition.get(true)); 
    sorted.addAll(endsWith3Partition.get(false)); 
+1

我認爲他前兩個更有效,因爲他們不會像分區那樣創建中間列表。 – Novaterata

+0

感謝您的回答 – Olia

+0

@Olia我高度推薦https://github.com/jOOQ/jool使流更簡單 – Novaterata

2

你可以寫一個比較,像下面這樣:

Arrays.sort(unordered_list, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     String[] o1s = o1.split('-'); 
     String[] o2s = o2.split('-'); 
     boolean end1_3 = o1s[1].equals("3"); 
     boolean end2_3 = o2s[1].equals("3"); 
     if(end1_3 && end2_3) { 
      return 0; //both end with 3 
     } else if(end1_3) { 
      return -1; //only the first ends with 3, so less than 
     } else if(end2_3) { 
      return 1; //only the second ends with 3, so greater than 
     } 
     if(!o1s[0].equals(o2s[0])) { // first group not same 
      return o1s[0].compareTo(o2s[0]); // compare first groups 
     } 
     return o1s[1].compareTo(o2s[1]); // assume equal 
    } 
}); 
1

您可以通過使用Java 8的stream做到這一點,如:

List<String> list = Arrays.asList(new String[]{"c-1","a-2","a-4","b-2","a-1","b-3","c-3","c-4"}); 

TreeMap<Boolean, List<String>> lists = list.stream() 
.collect(Collectors.groupingBy(s -> s.toString().endsWith("3"), TreeMap::new, Collectors.toList())); 

final List<String> result = new ArrayList<>(); 

lists.descendingMap().forEach((k, v) -> { 
    Collections.sort(v); 
    result.addAll(v); 
}); 

System.out.println(result);