1

Java で抽象データ型として部分的に順序付けられたセットを作成しています。数値セットの反復子バージョンと、関係の反復子を作成する必要があります。要素には整数の HashSet を使用し、リレーションにはペアの ArrayList を使用しました (ペアは、基本的に (x, y) のようなパラメーターとして 2 つの int を取るクラスです)。s 用と r 用の 2 つの反復子を作成する必要がありますが、特定の順序に従うR必要があります。 (x, y) と (y, z) が に属しているR場合、r の反復子は (y, z) を返す前に (x, y) を返す必要があります。

セット内の要素 n がペアの最初の要素であるかどうかを最初にチェックして返すヘルパー メソッドを作成しましたが、それが 2 番目の要素であるかどうかを確認できないようです。最初の要素を確認するにはどうすればよいですか返されるかどうか?

これが私のコードです:

private class IntGenerator implements Iterator {
        private Iterator<Integer> i;


        public IntGenerator () {
            i = S.iterator();
        }

        public boolean hasNext() {
            return i.hasNext();
        }

        public Object next() {
            int n = i.next();

            for (Pair p : R) {
                if (isInFirstElmPair(p,  n)) return n;
                else (isInSecondElmPair(p, n)) {
                                    // should check for the first element
                                    // if it was returned or not
                }
            }
        }

        public void remove() { throw new UnsupportedOperationException(); }
    }

このコードの助けやヒントをいただければ幸いです。ありがとう

編集:

さて、返された要素を保持する新しいセットを追加した後、コードを書きました。これが私が書いたものです。

Set<Integer> returnedNumbers = new HashSet<Integer> ();
public Object next() {
            int n = i.next();

            for (Pair p : R) {
                if (isInSecondElmPair(p, n)) {
                    if (returnedNumbers.contains(p.getFirstElm())) {
                        returnedNumbers.add(n);
                        return n;
                    }else{
                        returnedNumbers.add(p.getFirstElm());
                        return p.getFirstElm();
                    }
                }else{
                    returnedNumbers.add(n);
                    return n;
                }
            }
        }

このコードは正しいですか? また、Eclipse は、ループの外側で値を返す必要があることを示すエラーを表示するようですが、すべてのケースで既に内側に戻っているのはなぜですか? 助けに感謝します

4

1 に答える 1

1

値が以前に返されたかどうかを確認するには、もちろん、以前に返されたすべての値を追跡する必要があります。

したがって、イテレータで、定義できます

Set<Integer> previouslyReturned = new HashSet<Integer>();

次に、for ループで返す前に、そこに追加します。

if (isInFirstElmPair(p,  n)) {
    previouslyReturned.add(n);
    return n;
}
else (isInSecondElmPair(p, n)) {
    if (previouslyReturned.contains(n) {
        // do one thing
    } else {
        // do another thing
    }
}

ただし、この方法では、 iterator 内で返される順序で s のセットを構築しています。これを一度作成し ( a と考えてLinkedHashSetください)、別の場所に保持して、それを反復処理することは理にかなっています。

一般的に、このアプローチがあなたが望むものにつながるかどうかはわかりません。Sとの要素の順序について何か知っていますRか? 反復順序が任意の場合 (つまり、リレーションが予測できない順序で追加された場合)、イテレータは最初のリレーション ペアの前半を最初に返します。その要素が別のペアの後半にある場合でも同様です。要素 HashSet と関係 List を使用する必要がありますか?

于 2012-03-22T23:05:47.443 に答える