2015-09-25 188 views
0

我有一个JSONArray中的静态值列表。这是我的例子数组:自定义排序Groovy JSONArray - 自定义值首先,然后按字母顺序排列

JSONArray json = new JSONArray() 

json = ["B", "E", "C", "Z", "A", "X", "F", "H"] 

我需要以自定义的方式排序此json数组。我需要先放“E”,然后再放“F”,然后按字母顺序排序。

我希望我的最终结果是这样的:

json = ["E", "F", "A", "B", "C", "H", X", "Z"] 

Groovy中有基本的排序功能,我可以按字母顺序排序或反向字母顺序使用:

json.sort() 

json.reverse() 

我正在寻找一种简单的方法来进行自定义排序。

+0

http://stackoverflow.com/questions/12623728/custom-list-sorting –

+0

http://stackoverflow.com/questions/28210705/groovy-advance-sort/28212959#28212959 –

回答

0

如果你定义你自己的排序方法,你可以使用闭包,但你实际要求的是一些数组拆分和一些正常排序。

json.findAll{it = 'E'} + json.findAll{it = 'F'} + json.findAll{!(it in ['E', 'F'])}.sort() 

如果你担心通过您的JSON通过你的JSON 3次,你可以重复循环一次,将其添加到不同的阵列,你去的效率。

下面的例子是有点发烧友。注入方法将遍历一个集合,在每次迭代之间传递一个值(在我们的例子中是一个3列表的列表)。第一个列表将保存我们的E,第二个列表将保留我们的F,第三列列表将整个列表排序。我们使用.flatten()到3列出了转换回一个列表

List organizedList = json.inject([[],[],[]]) {List<List> result, String jsonValue -> 
    select(jsonValue) { 
     case 'E': 
      result.get(0).add(jsonValue) // Could have just added 'E' but I like symmetry 
      break; 
     case 'F': 
      result.get(1).add(jsonValue) 
      break; 
     default: 
      result.get(2).add(jsonValue) 
    } 
    return result // Gets passed to each iteration over json 
} 
organizedList.get(2).sort() // sort on a list modifies the original list 
organizedList.flatten() 

它使用的排序与你定义自己的排序封闭也有可能。但你可以看到,它不流动相当如容易

json.sort {String a, String b -> 
    if (a = b) return 0 // For efficiency's sake 

    def letterFirst = {String priority -> // Closure to help sort against a hardcoded value 
     if (a = priority) return 1 
     if (b = priority) return -1  
     return 0 
    } 

    def toReturn = letterFirst('E') 
    if (!toReturn) toReturn = letterFirst('F') // groovy evaluates 0 as false 
    if (!toReturn) toReturn = a <=> b 
    return toReturn 
} 
0

在我的5分钟实验我使用的权重:

def json = ["B", "E", "C", "Z", "A", "X", "F", "H"] 
def weights = [ E:10, F:9 ] 

json.sort{ 
    it.charAt(0) - (weights[ it ] ?: 0) 
} 

assert '[E, F, A, B, C, H, X, Z]' == json.toString() 

你可能要包括一些错误检查

+0

你可能会解释你的代码是如何工作的 – ScientificMethod

相关问题