Как отсортировать в порядке OCAML по двум элементам - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть такая структура:

type leitura=
{
nome:string;
notaMax:int;
media:float;
};;

И список, созданный из чтения элементов в файле.

Тогда у меня есть:

List.iter  (
fun leitura_l -> (
match leitura_l with
| [] -> print_string("> sem leitura <\n")
| _ ->
let leitura = get_leitura leitura_l in
printf "%-8s" leitura.nome;
printf "%-8d" leitura.notaMax; 
printf "%-8f" leitura.media;)
)list_estudantes;;

Мне нужно сначала распечатать список студентов, заказанных notaMax, и когда он будет равен, упорядочен также по средствам массовой информации.

Итак, я хочу получить что-то вроде этого:

Ном Nota Máx , Медия

Хорхе 15 13

Жуан 13 12

Марио 13 11

Можете ли вы мне помочь, пожалуйста. Спасибо.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы не указываете тип list_estudantes. Это выглядит из вашего кода, как будто это leitura list list. Это потому, что вы запускаете List.iter над этим значением, но на каждой итерации (обработанной функцией fun leitura_l -> ....) вы сравниваете параметр с шаблонами списка.

Но почему-то я не думаю, что это правильно, поскольку это означало бы, что у каждого учащегося есть несколько leitura записей.

Я подозреваю, что list_estudantes - это просто список (не список списков), и что ваша внутренняя функция должна выглядеть примерно так:

fun leitura ->
    printf "%-8s" leitura.nome
    (* And so on *)

Единственное, чего не хватает, - это сортировка списка. Вы можете отсортировать список, используя List.sort, где вы предоставляете функцию, которая сравнивает два значения типа leitura.

Функция сравнения выглядит примерно так:

let my_compare a b =
    if a.notaMax < b.NotaMax then -1
    (* And so on *)

As @ Пробел указывает на то, что ваш код будет намного легче читать и понимать, если вы напишите отдельные функции для сортировки и печати списка.

1 голос
/ 20 апреля 2020

Разделите ваш код. Напишите функцию, которая сортирует их, а затем напишите функцию, которая печатает отсортированный массив. Похоже на задачу, которую вы должны выполнить самостоятельно. Ты сможешь. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...