сортировка списков списков в haskell - PullRequest
7 голосов
/ 22 февраля 2010

Я полностью озадачен тем, как написать функцию, которая при наличии списка наборов возвращает наборы, разделенные на подсписки по размеру (и с подсписками, упорядоченными по размеру наборов, которые они содержат).

пример ввода

*Main> allSets
[[1,2],[8],[1,4,7,8],[5],[1,4],[1],[2,3],[1,2,5,8],[3,4,6,7],[1,2,3,4],[4],[5,6,7,8],[3,4],[3],[2,3,5,6],[7],[6],[2]]

образец вывода

*Main> collectByLength allSets
[[[2],[6],[7],[3],[4],[1],[5],[8]],[[3,4],[2,3],[1,4],[1,2]],[[2,3,5,6],[5,6,7,8],[1,2,3,4],[3,4,6,7],[1,2,5,8],[1,4,7,8]]]

По сути, он должен сгруппировать все наборы одинакового размера в их собственный набор, затем он группирует наборы следующего наибольшего размера.

Ответы [ 2 ]

10 голосов
/ 22 февраля 2010

Вы используете слово «наборы», но ваш код на самом деле использует списки ... Итак, вот решение на основе списка (легко адаптируемое, если вы хотите переключиться на фактические наборы):

import Data.List (sortBy)
import Data.Function (on)

groupBy ((==) `on` length) $ sortBy (compare `on` length) [[0],[1,2],[3]]
-- => [[[0],[3]],[[1,2]]]
3 голосов
/ 22 февраля 2010

После импорта Data.Function, Data.Ord и List вы можете написать это:

sortBy (comparing length) $ groupBy ((==) `on` length) $ sortBy (comparing length) theList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...