0

ねえ、誰かがこれをさらに説明できるかどうか疑問に思っていました. これは課題ではなく、私が受けたテストの 1 つの解決策です。私はそれを理解しようとしてきましたが、よくわかりません..

基本的に、与えられた答えの質問は次のとおりです。

[i] Java で RangeSet というクラスを作成します。このクラスはブール値の配列のデータ構造を使用して、3 つのメソッドを使用して整数のセットを表します。 [list] [ ]add - アイテムを追加しますが、アイテムが既にセットのメンバー [ ]remove - アイテムを削除しますが、アイテムがセットのメンバーでない場合はセットを変更しません [*]contains - アイテムがセットのメンバーであるかどうかを示すブール値を返します [/list ]

クラスには、整数 n を取り、1 から n までの範囲の整数を保持できるセットを表すオブジェクトを与えるコンストラクターが 1 つ必要です。コンストラクターは空のセットを与える必要があります。セットは破壊的でなければなりません。セットが操作によって変更された場合、メソッドは true を返し、そうでない場合は false を返す必要があります。[/i]

基本的には、1 から n の範囲に制限された整数のセットであり、ブール値の配列によって実装されます。add メソッドと remove メソッドは、呼び出しによってセットが変更されたかどうかを示すブール値を返します。メソッド add、remove、contains は 1 から n の範囲内になるため、引数が範囲内にない場合に対処する特別なコードはありません。

class RangeSet
{
     private boolean[] arr;

     public RangeSet(int n)
    {
          arr = new boolean[n];
    }

     public boolean add(int n)
    {
        if(arr[n-1]) return false;
        arr[n-1]=true;
        return true;
     }

    public boolean remove(int n)
    {
        if(!arr[n-1]) return false;
        arr[n-1]=false;
        return true;
    }

     public boolean contains(int n)
     {
          return arr[n-1];
     }
}

どうして arr = new boolean[n] と add(int n) の両方が 'n' で表されるのでしょうか? ソリューションは、実際の値をチェックする代わりに、新しく入力された整数の場所をチェックしませんか? ありがとうございました。

4

6 に答える 6

4

この実装は、独自のローリングではなく、JVM によってスローされた境界チェック例外に問題がないと仮定すると、スポットオンです。Java 配列は常に境界チェックを行うため、これは完全に受け入れられます。そのため、配列の境界外にあるものにアクセスして例外を取得する危険はありません。

n内部_

public RangeSet(int n)

そしてn

boolean add(int n)

関係ありません。関数パラメーターは、その名前が特定の関数のスコープ外を意味しないという意味で、ローカル変数に似ています。

また、配列はorbooleanと明示的に比較する必要がないため、 andを使用するだけで十分です。truefalsearr[n-1]!arr[n-1]

于 2013-05-10T18:06:31.330 に答える
1

渡されたコンストラクター/メソッドはそのnスコープ内にのみあります。つまり、nset byadd()は影響しませんremove()

から整数を取得したため、値の要素が既に挿入されている場合に true になるブール値<1; n>が必要です。それがそうです。Java は配列要素を 1 ではなく 0 からインデックス付けするため、.nnarrn-1

于 2013-05-10T18:06:43.210 に答える
1

n(コンストラクター内) とn(add メソッド内) は、たまたま同じ名前を共有する 2 つの異なるローカル変数です。名前は異なる可能性があり、少し混乱が少なくなりますが、変数のスコープがコンストラクター (またはメソッド) に限定されていることを考えると、同じ名前を使用することは許可されており、正しいものです。

arr[n-1]n-1配列のインデックスに格納されているブール値です。したがって、if (arr[n-1])次と同等です。

boolean valueAtNMinusOne = arr[n-1];
if (valueAtNMinusOne == true)

しかし、より簡潔で、経験豊富な Java 開発者にとって読みやすいものになっています。

于 2013-05-10T18:07:14.297 に答える
1

それnは単なるプレースホルダーです。ここで何が起こるかというと、配列に N 個のセルがあり、セットにtrue数値 n を追加すると (n <= N の場合)、n 番目のセルが に設定されます。したがって、arr[n-1](Java 配列は 0 から始まるため -1) にはtrue、数値 n がセット内にある場合は含まれ、falseそうでない場合は含まれます。

n > N を挿入しようとすると、例外が発生することに注意してください。

于 2013-05-10T18:08:18.583 に答える
0

add(n) メソッドでは:

arr[n-1]がtrueに設定されている場合は、新しい要素がアタッチされるため、取得できますか?

しかし、最後の位置のみをチェックして、セット内に特定の要素がないかどうかをどのようにチェックしますか - (arr[n-1]) ..それは、配列全体ではなく、最後の位置の要素のみをチェックしていることを意味しませんユーザーが指定した整数がセットに含まれているか?

于 2013-05-10T20:05:30.863 に答える