大変
基本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using namespace System; using namespace System::Collections::Generic; int main() { List<int> intlist; intlist.Add(2); intlist.Add(1); intlist.Add(7); intlist.Sort(); // 1,2,7 for each (int i in intlist) Console::WriteLine(i); intlist.Reverse(); for each (int i in intlist) Console::WriteLine(i); return 0; } |
これは簡単。しかし要素がクラスだと難しい
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using namespace System; using namespace System::Collections::Generic; typedef KeyValuePair<String^, int> KVP; ref class MyComparer : public System::Collections::Generic::IComparer<KVP> { public: enum class SORTBY { KEY, VALUE, }; private: SORTBY sortby_; public: MyComparer(SORTBY sortby) : sortby_(sortby){} virtual int Compare(KVP kvp1, KVP kvp2) { switch (sortby_) { case SORTBY::KEY: return kvp1.Key->CompareTo(kvp2.Key); case SORTBY::VALUE: return kvp1.Value.CompareTo(kvp2.Value); } return 0; } }; int main() { List<KVP> silist; silist.Add(KVP("x", 1)); silist.Add(KVP("y", 2)); silist.Add(KVP("z", 300)); silist.Add(KVP("a", 400)); silist.Add(KVP("b", 500)); silist.Add(KVP("c", 50)); // Exception! // silist.Sort(); // Sort by key MyComparer compByKey(MyComparer::SORTBY::KEY); silist.Sort(% compByKey); for each (KVP kvp in silist) Console::WriteLine(kvp.Key + "=" + kvp.Value); Console::WriteLine(); // Sort by value MyComparer compByValue(MyComparer::SORTBY::VALUE); silist.Sort(% compByValue); for each (KVP kvp in silist) Console::WriteLine(kvp.Key + "=" + kvp.Value); return 0; } |
SortはインターフェースIComparerを引数にとるので、まずはこれを継承するクラスをつくりその仮想関数Compareで比較をする。
自分のクラスで
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using namespace System; using namespace System::Collections::Generic; ref class MyClass { private: String^ s1_; public: MyClass(String^ s1) : s1_(s1) {} public: static int Compare(MyClass^ m1, MyClass^ m2) { return String::Compare(m1->s1_, m2->s1_); } virtual String^ ToString() override { return s1_; } }; ref class MyClassComparer : public System::Collections::Generic::IComparer<MyClass^> { public: virtual int Compare(MyClass^ mc1, MyClass^ mc2) { return MyClass::Compare(mc1, mc2); } }; int main() { List<MyClass^> mclist; mclist.Add(gcnew MyClass("fjwoeijf")); mclist.Add(gcnew MyClass("bzz32r")); mclist.Add(gcnew MyClass("+fwe3vv2r")); mclist.Add(gcnew MyClass("a32432faf")); mclist.Add(gcnew MyClass("3ff")); mclist.Add(gcnew MyClass("-fw654f")); // Exception! // mclist.Sort(); mclist.Sort(gcnew MyClassComparer()); // Sort by key for each (MyClass ^ mc in mclist) Console::WriteLine(mc->ToString()); return 0; } |
自分のクラスMyClassにstatic int Compareを定義する。次にMyClassComparerも定義する。こうしないでMyClassをIComparerから派生させると、Sortの際に自分のクラスを渡すことになってなんかおかしい感じになる。