Beachten Sie, dass dies setzt voraus, dass die Eingangsliste enthält nur Tupel gefiltert für den Gegenstand gewünscht, da die OP schon darauf. Alternativ könnte dieser Filter hier hinzugefügt werden, um diesen separaten Schritt zu vermeiden.
Um die Tupel mit dem Maximalwert eines beliebigen Elementes jedes einzelnen zu erhalten (Marken in diesem Fall, von denen mehrere mit denselben Marken sein könnten), könnten Sie etwas tun, ohne sich um Tupelordnungsregeln zu kümmern (die das erste Element zum Vergleich verwendet, wie in dieser Frage), solange die Liste mindestens ein Element enthält.
Verwendet ein Tupel, das den Wert der Marken für den ersten Listeneintrag und diesen Eintrag als anfänglichen Akkumulator enthält. Beginnen Sie dann, beginnend mit dem zweiten Tupel, der Liste im Akkumulator hinzuzufügen, wenn das betreffende Tupel Marks hat, die dem höchsten Wert entsprechen. Wenn das aktuelle Eingabetupel Markierungen über dem aktuellen Höchstwert hat, ersetzen Sie die Liste im Akkumulator durch eine neue Liste, die nur das aktuelle Eingabetupel enthält. Ansonsten, behalte Akku so wie er ist. Wenn die Liste nur einen Eintrag enthält, wird sie zurückgegeben, da sie der erste Akkumulator im foldl
-Aufruf ist.
find_max([{FirstMarks, _, _} = First | T]) ->
lists:foldl(
fun
%% Current tuple from input list has marks higher than current highest in accumulator,
%% so reset the accumulator to this new value for marks and new list containing
%% just this input list tuple
({N, _, _} = This, {MaxN, _L}) when N > MaxN ->
{N, [This]};
%% Current tuple from input list has marks equal to current highest in accumulator,
%% so add this input list tuple to the accumulator's list
({N, _, _} = This, {N, L}) ->
{N, [This | L]};
%% Current tuple from input list has marks less than current highest in accumulator,
%% so don't change accumulator
(_, Acc) ->
Acc
end,
%% Accumulator is tuple containing initial high value for marks, and list containing
%% containing the first element of the input list
{FirstMarks, [First]}, T).
1> tst_so:find_max([{30, a, a}]).
{30,[{30,a,a}]}
2>
2> tst_so:find_max([{30, a, a}, {20, b, b}, {40, c, c}, {10, d, d}, {40, e, e}]).
{40,[{40,e,e},{40,c,c}]}
3>
Listen: max/1 gibt mir die Höchstmarken, aber ich möchte die ID der Person maximal Markierungen erhalten –
'Listen: max' werden Sie das ganze Tupel geben. Ich habe 'lists: max' auf den ganzen Listen versucht (ohne Filterung) und es gibt zurück:' {30, "Geo", id3} ' –
ja du hattest Recht, Listen: max/1 nimmt das erste Element des Tupels und benutzt es, um das Maximum zu finden. Ich habe mit der geänderten Reihenfolge des Tupels als [{subject, marks, id}] versucht und habe das Tupel mit Mathe als Subjekt als Maximum bekommen. –