0

PoSet で見つかった一連の数値を反復処理するカスタム イテレータ クラスを作成しました。これが私のコードです。

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


        public IntGenerator () {
            returnedNumbers = new HashSet<Integer> ();
            i = S.iterator();
        }

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

        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 if (isInFirstElmPair(p, n)){
                    returnedNumbers.add(n);
                    return n;
                }
            }
            return n;
        }

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

問題は、数値を返すときは、半順序規則に従う必要があるということです。つまり、1. (x, y) が に属しているR場合、x は y の前に返される必要があります。

ただし、上記のコードはその順序に従っているように見えますが、重複を作成しています。コードを修正して許可しないようにするにはどうすればよいですか?

注: 私のコードでは、S は PoSet 内の数値のセットであり、それは HashSet であり、R は PoSet 内の関係を保持するためのペア (ペア: 2 つの int をパラメーターとして受け取るクラス) の配列リストです。

この問題を解決する方法はありますか? ありがとう

4

1 に答える 1

2

メソッドnextは常にを呼び出しi.next()、次の2つのいずれかを返します。

  • i.next()返された値
  • その値よりも小さい値。

これは、ポセットに{1,2,3,4}が含まれ、整数の自然な順序を使用して4を返す場合、今すぐi.next()4を返すか(1、2、および3が既に返されているため)、または4を返すことはありません(将来の値以上であるため)。

重複する理由は、の値ごとに1つの値を返すためです。また、i.next()返されない値もあるため(前の段落を参照)、当然、補償として複数回返される値もあります。i.next()から返された値が以前にメソッドによって返されたかどうかを確認することは決してないことに注意してくださいnext()。したがって、ポセット内の要素が他の要素よりも大きくない場合、i.next()その要素を返すと、メソッドはその要素next()を自動的に返します。以前にそれを返しました。

私はこれがあなたのアプローチを完全に変えるための唯一の賢明な修正だと思います。あなたの現在のアプローチをすぐに機能させることはできないと思います。イテレータのコンストラクタは、ポセットのすべての要素を受け入れ可能な順序のリストにコピーする必要があると思います。そうすると、next()メソッドはそのリストの次の要素を返すだけです。または、代わりに、現在のアプローチでは、とにかくRすべての呼び出しで反復する必要があるため、上の反復子に基づいて反復子を作成する方が理にかなっている場合があります。(ここでは、それ自体を使用してすでに順序付けられていると想定しています。そうでない場合、ループはまったく意味がなく、基本的にランダムに選択された要素を返します。)next() RRfor

アプローチに固執したい場合は、メソッドが返した要素だけでなく、返されたがメソッドが返さなかった要素も追跡するnext()必要あります。後でこれらの要素を返すことができる必要があります。i.next()next()

また、ループは希望どおりに機能しません。まだ返されていない要素が他にある場合でも、すでに返されている要素よりも小さい要素が見つかるとすぐfor (Pair p : R)に自動的に戻ります。(これは、すでにそれ自体を使用して注文されている場合です。そうでない場合、このループにはさらに大きな問題があります。)nnnR

于 2012-03-23T12:25:44.197 に答える