This language bar is your friend. Select your favorite languages!

Idiom #113 Iterate over map entries, ordered by values

Print each key k with its value x from an associative array mymap, in ascending order of x.
Note that multiple entries may exist for the same value x.

for my $k (sort {($mymap{$a}<=>$mymap{$b}) or ($a cmp $b)}
           keys %mymap) {
   print "$k: $mymap{$k}\n";
sub by_val_then_key {
    return ($mymap{$a} <=> $mymap{$b})
        or ($a cmp $b)

for my $k (sort by_val_then_key keys %mymap) {
   print "$k: $mymap{$k}\n";

 for_each(begin(m), end(m),
          [&s](const auto& kv) { s.insert(kv.second); });
using System.Collections.Generic;
using System.Linq;
Dictionary<String, String> mymap = new Dictionary<String, String>();
foreach(KeyValuePair<string, string> a in mymap.OrderBy(x => x.Value))
  Console.WriteLine("Key = {0}, Value = {1}", a.Key, a.Value);
import std.algorithm;
import std.array;
     .sort!((a, b) => a.value < b.value)
     .each!(p => writeln(p.key, " ", p.value));
|> Map.to_list 
|> Enum.sort(fn ({_k1, val1}, {_k2, val2}) -> val1 <= val2 end)
|> Enum.each(fn ({k, v}) -> IO.puts("#{k}: #{v}") end)
import "fmt"
import "sort"
type entry struct {
	key   string
	value int

type entries []entry
func (list entries) Len() int { return len(list) }
func (list entries) Less(i, j int) bool { return list[i].value < list[j].value }
func (list entries) Swap(i, j int) { list[i], list[j] = list[j], list[i] }

entries := make(entries, 0, len(mymap))
for k, v := range mymap {
	entries = append(entries, entry{k, v})

for _, e := range entries {
	fmt.Println("Key =", e.key, ", Value =", e.value)
import Data.Map as Map
import Data.List (sortBy)
import Data.Ord (comparing)
forM_ print $ sortBy (comparing snd) $ Map.toList mymap
  .sort((a, b) => a[1] - b[1])
  .forEach(([key, value]) => {
    console.log('key:', key, 'value:', value);
dict_pairs(D, _, Ps),
transpose_pairs(Ps, TPs),
keysort(TPs, Val_sorted),
forall(member(V-K, Val_sorted),
       format("~w:~w~n", [V, K]))
for x, k in sorted((x, k) for k,x in mymap.items()):
    print(k, x)
h.sort_by{|k,x| x}.each{|k,x| puts "#{k}: #{x}"}
use itertools::Itertools;
for (k, x) in mymap.iter().sorted_by_key(|x| x.1) {
	println!("[{},{}]", k, x);
let mut items: Vec<_> = mymap.iter().collect();
items.sort_by_key(|item| item.1);
for (k, x) in items {
    println!("[{},{}]", k, x);

Do you know the best way to do this in your language ?
New implementation...

Idiom created by

Related idioms