1

この問題は 4 つの異なるクラスで構成されています。問題はそれです:

  1. 演算子「<」は、タイプ「T」および「int」のオペランドには適用できません。
  2. 型 'T' を 'int' に暗黙的に変換することはできません。これは min メソッドにあります。

リスト[i]は、特に比較する必要があるものであるように思えます。リスト[i]を削除してそれに置き換えると、i1000にif (item.Equals(list[i]))なります。削除すると、0になります。

しかし、私はその整数に数字を加算することができ、数字が最小 (2) よりも大きい場合、数字 2 を認識または認識します。最後の部分はあまり意味をなさない可能性があり、説明が難しい場合があります。

最小の整数を得るために何を、またはどのように比較できますか? 何か小さいものを見逃しているのでしょうか、それとも非常に大きなものでしょうか? list[i] は比較する必要がありますか?

私がまだ抱えている問題は、比較を行おうとすると、比較で T が認識されないことです。クラス パラメーターでそれを宣言すると、他のクラスで多くの頭痛の種が発生します (また、通常は IComparable も表示されません)。クラスパラメータで)

たぶんと思った

    public int min(ref T item)
    {
        int min = 1000;
        T tempItem = list[0];

        for (int i = 0; i < next; i++)
        {
            if (list[i].CompareTo(tempItem) < 0)
            {
                tempItem = list[i];
                min = i;
            }
        }
        item = tempItem;
        return min;

    }

うまくいきますが、まだうまくいきません。この問題は、CompareTo の問題に更新されています。

    using System;

    namespace ArrayListNamespace
    {
      public abstract class ArrayList<T>
      {
        protected T[] list;
        protected int length;



        public ArrayList()
        {
            list = new T[100];
            length = 0;
        }

        public abstract void insert(ref T item);


        public int remove(ref T item)
        {
            if (length == 0) return 0;
            else
            {
                //find value, if it exists
                for (int i = 0; i < length; i++)
                {
                    if (item.Equals(list[i]))
                    {
                        list[i] = list[length - 1];
                        length--;
                        return 1;
                    }
                }
                return -1;
            }
        }
        public void print()
        {
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine(list[i]);
            }
        }
        public void removeAll(ref T item)
        {
            for (; ; )
            {
                int r = remove(ref item);
                if (r == -1) break;
            }
        }
        public void removeAt(int location) //  probably can delete this
        {
            list[location] = list[length - 1];
            length--;
        }

        public int min(ref T item)
        {
            int min = 1000;

            for (int i = 0; i < length; i++)
            {

                    if (list[i] < min)
                    {
                        min = list[i];
                    }
            }
            return min;

        }
    }
}

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     using UnorderedArrayListNamespace;

     namespace test
       {
    class Program
    {
        static void Main(string[] args)
        {
            UnorderedArrayList<int> u = new UnorderedArrayList<int>();
            u.print();
            int var = 5;
            u.insert(ref var);
            u.insert(ref var);
            var = 12;
            u.insert(ref var);
            var = 2;
            u.insert(ref var);
            var = 29;
            u.insert(ref var);
            u.print();
            Console.WriteLine();
            var = 5;
            u.removeAll(ref var);
            u.print();

            Console.WriteLine("The min value is " + u.min(ref var));
        }
    }
}


     using System;

     namespace ArrayListADTNamespace
     {
    public interface ArrayListADT<T>
    {
        // insert() method places one item in the list
        void insert(ref T item);
        // remove() method removes first instance of item in list
        int remove(ref T item);
        // print() method prints all items in list
        void print();
        // removal all method
        void removeAll(ref T item);
        // min method
        int min(ref T item);
    }
}

    using System;
    using ArrayListNamespace;
    using ArrayListADTNamespace;

    namespace UnorderedArrayListNamespace
    {
    public class UnorderedArrayList<T> : ArrayList<T>, ArrayListADT<T>
    {
        public UnorderedArrayList()
        {
        }

        public override void insert(ref T item)
        {
            list[length] = item;
            length++;
        }
    }
}
4

2 に答える 2

3

あなたが抱えている問題は、一般的に、ジェネリックコンテナクラスを構築していて、クラス内のすべてが整数であると仮定していることです。あなたのmin方法を見てみましょう:

public int min(ref T item)
{        
  int min = 1000;

  for (int i = 0; i < length; i++)
  {
    if (list[i] < min)
    {
      min = list[i];
    }
  }

  return min;
}

これはTが数値型であれば意味がありますが、UnorderedArrayList<string>orなどを作成した場合はどうなるUnorderedArrayList<System.Uri>でしょうか? minあなたの機能はどのように機能しますか?ジェネリック パラメーターを使用して型を作成することにより、コンパイラーに「このクラスはこれまでに発明されたすべての型で動作する必要があります」と伝え、それらの大部分は int に変換したり比較したりすることはできません。

簡単な答えは交換することです

int min = 1000;

T min = default(T);

ただし、これら 2 つのステートメントは明らかに同一ではありません。同時に、メソッドにデフォルトの最小値 1000 をコーディングしても意味がありません。たとえば、「犬、猫、馬、牛、豚」のリストを指定すると、そのリストの最小値は 1000 になります。 ?

注意すべきもう 1 つのことは、配列内のオブジェクトを相互に比較することさえできると仮定していることです。これは安全な仮定ではありません。それを強制するには、次の 2 つのことを行う必要があります。

  1. 比較できるように型を制約します。

    public abstract class ArrayList<T> where T : IComparable
    
  2. IComparable演算子の代わりに のメソッドを使用します。

    if (list[i].CompareTo(min) < 0)
    {
      min = list[i];
    }
    
于 2013-09-23T22:38:42.640 に答える
2

現在 (配列内の最小値を探しているという前提で)、整数値をジェネリック型 T の変数と比較しようとしています。これは、配列リストが有効な型の値を保持していない可能性があることを意味します。 int との比較。代わりに必要なのは、次のようなものです

public int min(ref T item)
{
    int min = 1000;
    T tempItem = list[0];

    for (int i = 0; i < length; i++)
    {
        if (list[i].CompareTo(tempItem) < 0)
        {
            tempItem = list[i];
            min = i;
        }
    }
    item = tempItem;
    return min;

}

このようにして、渡したアイテム参照は最小アイテムを保持し、メソッドは最小値のインデックスを返します。

アイテムの値を返すだけの場合は、これを試してください:

public T min( )
{
    T tempItem = list[0];

    for (int i = 0; i < length; i++)
    {
        if (list[i].CompareTo(tempItem) < 0)
        {
            tempItem = list[i];
        }
    }
    return tempItem;
}
于 2013-09-23T22:40:19.323 に答える