0

可用性に基づいて配列から整数を取得できるようにしたいと考えています。使用可能な整数が選択されると、返されるまで使用できなくなります。

これは単純なプールのアイデアに従いますが、私のアプローチでは問題が複雑になりすぎていると思います。アドバイスをお願いします。

私が実装している重要なプールのような関数がいくつかあります。

  • 利用可能な最初の最小整数を取得する
  • 利用可能なすべての整数を昇順で取得する
  • 配列から特定の整数を取得する
  • 特定の整数を配列に戻して、再び使用できるようにします

最初の方法では、整数のリクエストが正常に呼び出されるたびに値をインクリメントして、使用可能な整数の集計を保持します。この値は、.IsAvailable ブール値でソートされている場合に、利用可能な整数の開始インデックスを決定するために使用できます。

    public static int GetInteger()
    {
        // Get the next available integer
        int startIndex = integers.Length - numAvailableIntegers;

        var c = integers[startIndex];
        c.IsAvailable = false;

        // Sort the integers by availability
        Array.Sort(integers, SortIntegerAvailability.Comparer);

        numAvailableIntegers--;

        return c.Value;
    }

ここでの問題は、ブール値でソートすると、後で整数値の昇順でソートする必要があることです。

class SortIntegerAvailability : IComparer<Integer>
{
    static IComparer<Integer> comparer = new SortIntegerAvailability();

    public int Compare(Integer a, Integer b)
    {
        if (a.IsAvailable == b.IsAvailable)
        {
            return 0;
        }
        else return (a.IsAvailable == true) ? 1 : -1;
    }

    public static IComparer<Integer> Comparer
    {
        get { return comparer; }
    }
}

これにより、私はこれを複雑にしすぎており、この問題にアプローチするよりエレガントな方法があると考えるようになりました。助言がありますか?

4

3 に答える 3

2
class IntegersGame
{
    private List<int> _sourceintegers;
    private List<int> _integers;
    public void Add(List<int> integers)
    {
        _sourceintegers = integers;
        Reset();
    }

    public void Reset()
    {
        _integers = _sourceintegers.Select(p => p).ToList();
        _integers.Sort();
    }

    public int GetFirst()
    {
        int ret = _integers.First();
        _integers.Remove(ret);
        return ret;
    }

    public List<int> GetAll()
    {
        return _integers;
    }

    public void Release(int des)
    {
        if (_sourceintegers.Contains(des))
        {
            _integers.Add(des);
            _integers.Sort();
        }
    }

    public int? Get(int source)
    {
        if(_sourceintegers.Contains(source) && (_integers.Contains(source))){
            _integers.Remove(source);
            return source;
        }else{
            return null;
        }
    }
}
于 2013-10-20T20:12:50.513 に答える
0

単純な整数配列のクローンを作成し、最初の項目をプルして、クローンされた配列をサイクルごとに再ソートしないのはなぜですか?

于 2013-10-20T19:30:31.783 に答える
0

このようなものから始めて、パフォーマンスに問題がある場合は最適化します。整数コレクションのサイズに応じて、これは非常に高速なソリューション (比較的小さなコレクション サイズの場合) または非常に遅いソリューション (非常に大きなコレクション サイズの場合) になる場合があります。

private class MyInteger
{
    public int Value;
    public bool Available;
    public void MyInteger(int value, bool available)
    {
        Value = value;
        Available = available;
    }
}
public class IntegerPool
{
    private IList<MyInteger> _integers = new List<MyInteger>();

    public void IntegerPool(List<int> startingCollection)
    {
        startingCollection.Sort();

        foreach (var integer in startingCollection)
        {
            _integers.Add(new MyInteger(integer, true));
        }
    }

    public int GetFirstAvailable()
    {
        foreach (var integer in _integers)
        {
            if (integer.Available)
            {
                integer.Available = false;
                return integer.Value;
            }
        }

        throw new Exception("No more integers available.");
    }

    public IList<int> GetAllAvailable()
    {
        var list = new List<int>();
        foreach (var integer in _integers)
        {
            if (integer.Available)
                list.Add(integer.Value);
        }

        return list;
    }

    public int? TryGetSpecific(int specific)
    {
        foreach (var integer in _integers)
        {
            if (integer.Value == specific)
            {
                if (!integer.Available)
                    return null;

                integer.Available = false;
                return integer.Value;
            }
        }

        throw new Exception("Integer not in collection.");
    }

    public void ReleaseInteger(int integerToBeReleased)
    {
        foreach (var integer in _integers)
        {
            if (integer.Value == integerToBeReleased)
            {
                integer.Available = true;
                return;
            }
        }
    }
}
于 2013-10-20T19:42:45.147 に答える