0 から 10 のスケールで 4 つの数字のシーケンスが与えられた場合、一意の数字を抽出するにはどうすればよいでしょうか?
例えば:
- 10、10、10、10 = 1 つの数字
- 10,10,9,10 = 2 つの異なる数字
- 10,8,7,9 = 4 つの異なる数字
- 10、9、10、8 = 3 つの異なる数字
0 から 10 のスケールで 4 つの数字のシーケンスが与えられた場合、一意の数字を抽出するにはどうすればよいでしょうか?
例えば:
Set<Integer>
などの は重複HashSet<Integer>
を許可しないため、物事を単純化できます。Set の重複に対して add メソッドを呼び出すことができますが、Set に既に項目が含まれている場合、add メソッドは return 以外のことをしませんfalse
。すべてのアイテムを追加した後にセットを取得するsize()
と、重複していないアイテムがいくつ存在するかがわかります。
ここで最初に注意すべきことは、この演習は数値 [0,10] に関するものではないということです。それは実際には、4 つの異なる要素を持つことであり、それらは同じである場合もあれば、同じでない場合もあります。(数字、ラテン文字、リンゴ、バナナ、オレンジなど)
関数 (x1,x2,x3,x4) -> n を探しています。ここで、この特定のケースでは、すべての x は整数 [0,10] であり、n は常にタプル内の異なる要素の数です。 1 からタプルの長さ、この場合は 4。
ホバークラフトの答えを拡張するために、Set
インターフェイスとその実装、たとえばHashSet
、ここで安価で実用的なソリューションを提供します。
public int getDistinctCount(int x1, int x2, int x3, int x4) {
Set<Integer> set = new HashSet<Integer>();
set.add(x1);
set.add(x2);
set.add(x3);
set.add(x4);
int count = set.size();
return count;
}
これは機能します。本質的に、この演習では、タプル (またはマルチセット) の特性をセットの特性にマッピングすることが求められるためです。タプル t が与えられた場合、それがセットである場合、そのカーディナリティはどうなるでしょうか?
何が起こっているのかを理解するには (完全に理解できない場合に備えて)、HashSet
(そしてAbstractSet
そこから...) のソース コードを読んで、両方のクラスが存在しない場合にこれをどのように実装するかを考える価値があります。
基本的に、4 つの (またはいくつの) 数値のリストを繰り返し処理し、既に見た要素を追跡する必要があります。すべての要素について、それが私たちにとって新しいかどうかを調べるために、すでに見た要素を繰り返し処理する必要があります。はいの場合、「個別の要素」カウンターをインクリメントします。または、上記のソリューションのように、最後に個別の要素を数えることもできます。