0

スタック内のノードを追跡するのに問題があります。私のノードには、0 ~ 20 の数値を含む 2d int 配列と、現在のノード状態に到達するためのコストを測定する別の整数 (2d int 配列) が含まれています。

現在、スタックにスキップしたいノードが含まれているかどうかを追跡する方法がわかりません。これは、スタックに既に存在するか、以前にポップされているためです。そのため、まったく同じ状態 + コストを持つノードで同じ比較を繰り返すことは避けます。

q が私のスタックで、n1 が現在のノードである場合、私はちょうどポップしました。

q.contains(n1);

trueを返すことはありますか?

また、すべてのノードの文字列を作成する ArrayList を作成してみました

1 2 4
5 3 6
0 7 8

文字列「1,2,4,5,3,6,0,7,8」を作成します。この文字列を配列リストに追加し、aList.contains(stringKey); を使用するとします。trueを返すことはありませんか?

contains() にはオブジェクトを渡す必要があるため、オブジェクトで何かをする必要があると思いますが、これを行う方法が 100% わからないからです。

4

1 に答える 1

1

リスト内に見つかった場合、任意のリストのcontains(obj)が返されます。メソッドで指定した を使用して、リスト内のそれぞれをチェックします。したがって、使用しているオブジェクトのメソッドをオーバーライドする必要があります。trueobjobjectobjequals()equals()

例 :

class MyObj {
    int a;
    char b;

    MyObj(int a, char b) {
        this.a = a; this.b = b;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof MyObj){
            MyObj myobj = (MyObj) obj;
            if(myobj.a == a && myobj.b == b){
                return true;
            }
        }
        return false;
    }
}

これで、次のように任意で使用できListます。

ArrayList<MyObj> list = new ArrayList<>();
MyObj obj = new MyObj(3, 'b');
list.add(obj);
System.out.println(list.contains(obj));
System.out.println(list.contains(new MyObj(3, 'b')));

出力:

true
true

優れた設計パターンによれば、オーバーライドhashCode()することにした場合もオーバーライドする必要がありますequals()

于 2014-10-19T22:53:06.360 に答える