Groovy list.sort первым, вторым тогда третьи элементы

Порядок, в котором Вы объединяющие таблицы или Вы помещаете Ваш НА / ГДЕ условия не должны иметь значения.

оптимизатор запросов должен оптимизировать и использовать лучший порядок так или иначе (и chosing, как лучше всего отфильтровать данные, где запустить, и т.д.)

Как многие другие, хотя, я предлагаю использовать синтаксис ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ, так как это делает вещи намного более читаемыми, это более прозрачно с синтаксисом ЛЕВЫХ или ПОЛНЫХ соединений также.

существует несколько больше живущего текста об этом здесь: http://linus.brimstedt.se/?/article/articleview/SQL Синтаксис

/B

26
задан 23 September 2009 в 18:00
поделиться

4 ответа

У вас должна быть возможность перебирать желаемую сортировку в обратном порядке:

list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]

list = list.sort{ a,b -> a[2] <=> b[2] }
list = list.sort{ a,b -> a[1] <=> b[1] }
list = list.sort{ a,b -> a[0] <=> b[0] }

assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]

Каждый должен перекрывать предыдущий ровно настолько, чтобы объединенная сортировка оставалась нетронутой.


Вы также можете объединить их в цепочку. порядок с оператором Элвиса, ?: , который будет перенесен на следующее сравнение, когда предыдущее будет равно (и <=> вернет 0 ) :

list.sort { a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] }
28
ответ дан 28 November 2019 в 07:10
поделиться

Если вы хотите отсортировать массивы произвольной (хотя и однородной) длины, вы можете использовать это, и он сделает это за один проход:

def list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]

list.sort { a, b -> 
    for (int i : (0..<a.size())) {
        def comparison = (a[i] <=> b[i])
        if (comparison) return comparison
    } 
    return 0
}

assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
8
ответ дан 28 November 2019 в 07:10
поделиться

Вот то, что я придумал, думаю, не из самых удачных способов ..

list = list.sort{ a,b -> 
    if(a[0].compareTo(b[0]) == 0) {
        if(a[1].compareTo(b[1]) == 0) {
            return a[2].compareTo(b[2]);
        } else {
            return a[1].compareTo(b[1]);
        }
    } else {
        return a[0].compareTo(b[0]);
    }
}
0
ответ дан 28 November 2019 в 07:10
поделиться

вы можете использовать библиотеку CollectionUtils kobo-commons.

https://github.com/kobo/kobo-commons/wiki/sort-by-multiple-keys

import org.jggug.kobo.commons.lang.CollectionUtils

CollectionUtils.extendMetaClass()


list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]
list = list.sort{ [ it[0], it[1], it[2] ]} // sort by multiple keys
assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]

list2 = [ [name:"a", age:13], [name:"a",age:15], [name:"b", age:13] ]
list2 = list2.sort{[it.name, it.age] } // sort by name and age
assert list2 == [[name:"a", age:13], [name:"a", age:15], [name:"b", age:13]]
4
ответ дан 28 November 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: