とあるQ&A系掲示板にあった質問:
学籍番号と得点(成績)の組:
record (7, 345), (8, 678), (1, 123), ...
それと学籍番号の列:
target { 4, 5, 3, 1, 2 };
があるとき、targetを得点順にソートせよ。
おもしろそーだったのでC++で解きました。
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
struct keyed_less {
std::map<int,int>& ref;
keyed_less(std::map<int,int>& r) : ref(r) {}
bool operator()(int x, int y) const {
return ref[x] < ref[y];
}
};
int main() {
int master[] = {
7, 345,
8, 678,
1, 123,
2, 456,
5, 567,
6, 812,
3, 781,
4, 234,
};
std::map<int,int> record;
for ( int i = 0; i < 8; ++i ) {
record[master[i*2]] = master[i*2+1];
}
int no[5] = { 4, 5, 3, 1, 2};
std::vector<int> target(no, no+5);
std::sort(target.begin(), target.end(), keyed_less(record));
for ( int i = 0; i < target.size(); ++i ) {
std::cout << target.at(i) << '/'
<< record[target.at(i)] << std::endl;
}
std::cout << std::endl;
}
C#だとこんなとこでしょか:
using System;
using System.Collections.Generic;
class Program {
static void Main() {
int[] master = {
7, 345,
8, 678,
1, 123,
2, 456,
5, 567,
6, 812,
3, 781,
4, 234,
};
Dictionary<int,int> record = new Dictionary<int,int>();
for ( int i = 0; i< 8; ++i ) {
record.Add(master[i*2], master[i*2+1]);
}
int[] target = { 4, 5, 3, 1, 2 };
Array.Sort(target,
delegate (int x, int y) { return record[x] - record[y];});
Array.ForEach(target,
delegate (int x) { Console.WriteLine("{0}/{1}", x, record[x]); });
}
}
匿名delegateってスゴイと思う♪