1

最初に私がやろうとしていることの概要:

ユーザーがキーを押すたびに、現在の時刻を記録しています。レコードが 5 つ以上ある場合は、キーを押す間の平均時間を計算する必要があります (最後の 5 ~ 10 回のキー押しのみを保持します)。

私が最初に座ってこの問題を見たとき、簡単だと思いました。スタックを使用して、単純に 10 アイテム未満に保ちます。

質問:

  • スタックに最大 10 個の値しか含まれないようにするにはどうすればよいですか? (日時型)
  • スタックに保存されている各日時間の平均時間をどのように見つけますか?

ありがとう

ダン

4

1 に答える 1

4

スタックは使用せず、容量が制限されたキューを使用します。これは、次のような方法で実現できます。

public class CappedQueue<T> : IEnumerable<T> {

    private readonly m_Capacity;
    private Queue<T> m_InnerQueue;
    public CappedQueue<T>(int capacity) {
        m_Capacity = capacity;
        m_InnerQueue = new Queue<T>(capacity);
    }

    // Wrap required methods 
    public void Enqueue(T item){
        if(m_InnerQueue.Count()) == capacity) {
            m_InnerQueue.Dequeue() ;                
        }

        m_InnerQueue.Enqueue(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return m_InnerQueue.GetEnumerator();
    }
}


public class Test {
    public void Foo()
    {
        var queue = new CappedQueue<DateTime>(5);

        queue.Enqueue(DateTime.Now); // each time the user press the key
        queue.Enqueue(DateTime.Now); // each time the user press the key
        queue.Enqueue(DateTime.Now); // each time the user press the key


        TimeSpan diff = (queue.Last() / queue.Fisrt())/queue.Count();
    }
    public void Foo2()
    {
        var queue = new CappedQueue<int>(5);

        queue.Enqueue(10);
        queue.Enqueue(20);
        queue.Enqueue(30);

        var average = queue.Average(x=>x);
    }
}
于 2012-06-30T14:10:29.000 に答える