2017-04-12 47 views
0

的POJO的名单,我想排序基于传入的领域(的SortField)和顺序(中将sortOrder)参数的POJO的名单上有这方面的工作(6场) -排序在Java中

switch (sortField) { 
    case "field1" : 
    if (sortOrder == "asc") { 
     list.sort((lItem1, lItem2) -> lItem1.getField1().compareTo(lItem2.getField1())); 
    } else { 
     list.sort((lItem1, lItem2) -> lItem2.getField1().compareTo(lItem1.getField1())); 
    } 
    break; 
    case "field2" : 
    if (sortOrder == "asc") { 
     list.sort((lItem1, lItem2) -> lItem1.getField2().compareTo(lItem2.getField2())); 
    } else { 
     list.sort((lItem1, lItem2) -> lItem2.getField2().compareTo(lItem1.getField2())); 
    } 
    break; 
    //... 
} 

这工作完美,但感觉有点笨重,我只是想知道是否有人可以指点我一个(相对简单!)整数&更优雅的方式来做到这一点?

+1

使用不同Comperators – Jens

+1

比较器和[thenComparing](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparing-java.util.Comparator-) –

+2

我因为它更适合于http://codereview.stackexchange.com/ – Flown

回答

4

您可以创建一个Map<String, Comparator<MyPojo>>,并用它喜欢:

Map<String, Comparator<MyPojo>> comparators = new HashMap<>(); 
comparators.put("field1", Comparator.comparing(MyPojo::getField1)); 
comparators.put("field2", Comparator.comparing(MyPojo::getField2)); 
//... 

Comparator<MyPojo> comp = comparators.get(sortField); 

list.sort("asc".equals(sortOrder) ? comp : comp.reversed()); 
+0

更好的回答,删除我的... –

2

我认为,有一些事情你可以考虑像可重用性和重复码。

重复码:

if (sortOrder == "asc") 
     { 
      list.sort((lItem1, lItem2) -> lItem1.getField2().compareTo(lItem2.getField2())); 
     } 
     else 
     { 
      list.sort((lItem1, lItem2) -> lItem2.getField2().compareTo(lItem1.getField2())); 
     } 

为了解决这个问题,我会写或者两种不同的方法做在递增或递减排序分别或写一个单一的方法与参数做到既定义排序顺序。

解决方案

例1:

public List sortedList(List items, boolean isOrderAscending) { //do stuffs with items based on isOrderAscending and return sorted items} 

例2:

public List sortedListInAscendingOrder(List items) { //return ascending ordered list} 
public List sortedListInDescendingOrder(List items) { //return descending ordered list} 

我甚至会写一个方法来获得从中将sortOrder排序顺序。

public boolean isInAscending(String sortOrder) { //return true or false based on sortOrder} 

编译全:

List sortedItems = sortedList(items, isOrderAscending(sortedOrder)); 

给予足够的想法之后也许,整场部分可以在一个更优雅的方式改变。