2015-09-25 59 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