0

私は、バイナリ検索ツリーコンソールアプリケーション、具体的には、2つのターゲットノード間の最短パスを一覧表示するメソッドに取り組んでいます。私のアプローチは

1)ルートノードからターゲットまでのツリー内の各ターゲットノードの値のArrayListを作成します(パスごとに1つのArrayList)2)2つのArrayListを比較し、最後の1つ(2つの場所を表す)を除くすべての重複を削除しますパスブランチ3)残りの2つのArrayListを1つの配列に結合し、forループを使用してコンソールに出力します

これは私が取り組んでいる方法です。私が抱えている問題は、ArrayListsが_pathArrayList1:5、7の値で出力されているにもかかわらず、「if(list1 [n] == list2 [n])」というブロックに入らないことです。 、9 _pathArrayList2の内容:5、7、9、10、12、11

型キャストを試しましたが、役に立ちませんでした。

array<T>^ removeDuplicates(ArrayList^ list1, ArrayList^ list2)
{
    int forLoopCount;
    int i; // for loop iterator for this method
    Console::WriteLine(L"Contents of _pathArrayList1: ");
    for (i = 0; i < list1->Count; i++)
        Console::WriteLine(list1[i]);

    Console::WriteLine(L"Contents of _pathArrayList2"); 
    for (i = 0; i < list2->Count; i++)
        Console::WriteLine(list2[i]);

    // find out which array is the shortest; we need to use the shorter of the two
    if (list1->Count - list2->Count < 0)
        forLoopCount = list1->Count;
    else
        forLoopCount = list2->Count;
    Console::WriteLine("Value of forLoopCopunt is " + forLoopCount);
    array<T>^ combineArray = gcnew array<T>(forLoopCount);

    for (int n = 0; n < forLoopCount; n++)
    {
        Console::WriteLine(L"List1[n] = " + list1[n]);
        Console::WriteLine(L"list2[n] = " + list2[n]);

        if (list1[n] == list2[n])  // never entering this block of code
        {
            if (list2[n+1] == list1[n+1])
            {
                Console::WriteLine(L"Removing " + list1[n] + " and " + list2[n]);
                list1->RemoveAt(n);
                list2->RemoveAt(n);
                n --;
            }
            else
            {
                Console::WriteLine(L"Deleting " + list1[n]);
                list1->RemoveAt(n);
                //_pathArrayList1->Reverse();
                return combineArray = combineArrays(_pathArrayList1, _pathArrayList2);
            }
        }
    }
    return combineArray = combineArrays(_pathArrayList1, _pathArrayList2);
}
4

1 に答える 1

0

「型キャストを試しましたが、うまくいきませんでした」と明確にしてください。

ArrayListジェネリックを使用しないため、すべてをオブジェクトとして扱います。2つのオブジェクトがintであっても、Objectとして入力==すると、期待どおりに整数値が比較されません。

Object^ o1 = 1;
Object^ o2 = 1;

bool asObject = (o1 == o2); // false
bool asInt = ((int)o1 == (int)o2); // true

に切り替えるArrayListList<int>==期待どおりに機能し、型安全性の利点が追加されます。

その他の注意事項:

  • 設定するときはMath.Minを使用しますforLoopCount。他の人が立ち止まって、コードが正しいかどうかを判断する必要がある場合は、この関数を使用してください。
  • かどうかを確認する前list2[n+1] == list1[n+1]に、両方のリストに余分なアイテムがあることを確認してください。サンプルデータ(5-7-9および5-7-9-10-12-11)では、がlist1[n]9の場合に例外が発生します。
  • gcnew array<T>(forLoopCount)削除することも、combineArray完全に削除することもできます。CombineArraysの戻り値を割り当てると、そのオブジェクトは破棄されます。

編集

渡されたリスト内のオブジェクトがアイテム自体である場合(ノードアドレス、または常にである他の何かではない)、一般的な定義にint追加することをお勧めします。where T : IEquatable<T>これにより、Equals(T)==メソッドが得られ、すべてのタイプに定義されているわけではない、の代わりにそれを使用できます。(これを型に実装する場合は、すべてが一貫するように、Equals(T)、Equals(object)、およびGetHashCode()の3つのメソッドすべてを実装してください。)

そもそも検索ツリーの構築を支援するために、あなたはIComparable<T>役に立つかもしれません。比較演算子(例)の代わりにCompareToメソッドを使用し<ます。

于 2013-02-04T19:47:50.917 に答える