ソート済みListから範囲を取り出す [.NET]

| コメント(0) | トラックバック(0)

...あれ? どぉやんだ? (東方算程譚) より。

名前と得点をメンバに持つExamの集合がある。
得点順にソートし、30点以上80点未満を列挙せよ。

これを System.Collections.Generic.List<Exam> でやろうとすると
どないになるんす?

というわけで、やってみた。(なぜかあっちのコメント投稿が通らなかったので...)

using System;
using System.Collections.Generic;

namespace test
{
  class Exam : IComparable<Exam>
  {
    private string name;
    private int score;
    
    public Exam(string name_, int score_)
    {
      name = name_;
      score = score_;
    }
    
    int IComparable<Exam>.CompareTo(Exam other)
    {
      if ( score < other.score )
        return -1;
      else if ( score > other.score )
        return 1;
      return 0;
    }
  
    public override string  ToString()
    {
      return name + ":" + score;
    }
  }
  
  class Program
  {
    public static void Main(string[] args)
    {
      List<Exam> exam = new List<Exam>();
      exam.Add(new Exam("相川", 35));
      exam.Add(new Exam("井上", 20));
      exam.Add(new Exam("上村", 80));
      exam.Add(new Exam("江口", 50));
      exam.Add(new Exam("小田", 75));
      
      exam.Sort();
      int from = exam.BinarySearch(new Exam("", 30));
      int to = exam.BinarySearch(new Exam("", 80));
      
      from = from < 0 ? ~from : from;
      to = to < 0 ? ~to : to;
      
      while ( from != to )
        Console.WriteLine(exam[from++]);
      
      Console.ReadKey();
    }
  }
}

List<T>.BinarySearch(T) は要素が見つからなかった場合に、それよりも大きい要素のindex(がなければCount)のビット毎の補数 を返すらしいので、bit反転だけでらくらくいけちゃいますね。

トラックバック(0)

トラックバックURL: http://floralcompany.jp/mt/mt-tb.cgi/173

コメントする

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        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

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic