通常、ある程度の開発経験のある友人であればこのような機能を実現できますが、それは単なる効率の問題です。このような問題に直面したとき、私たちは常にフラットな順序で考えます。まず配列を生成し、ループで乱数を配列に追加します。その際、まず配列内に乱数が存在するかどうかを確認します。この番号が存在しない場合は配列に直接追加され、存在する場合は追加されません。私たちは大体このように問題を考えますし、このように考えれば機能は達成できるのです、先ほども言いましたように、それはただ効率の問題です。
この質問の意味をよりよく理解するために、まず具体的な内容を見てみましょう。1 ~ 100 のランダムな配列を生成しますが、配列内の数値は繰り返すことができません。つまり、位置はランダムですが、配列の要素は繰り返すことはできません。ここでは、配列の長さは指定されていません。1 ~ 100 の間の任意の長さにすることができます。
次に、次のコードに示すように、通常は ArrayList を使用して実装する方法を見てみましょう。
次のようにコードをコピーします。
パッケージ cn.sunzn.randomnumber;
java.util.ArrayListをインポートします。
java.util.Randomをインポートします。
パブリック クラス デモ {
public static void main(String[] args) {
オブジェクト[] 値 = 新しいオブジェクト[20];
ランダム ランダム = new Random();
ArrayList<Integer> リスト = new ArrayList<Integer>();
for (int i = 0; i < 値.length; i++) {
int 数値 = ランダム.nextInt(100) + 1;
if (!list.contains(number)) {
list.add(数値);
}
}
値 = list.toArray();
/************ 配列を走査してデータを出力します************/
for (int i = 0; i < 値.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
上記の実装プロセスは比較的非効率的です。追加するたびに、その数値が現在のリストに存在するかどうかを調べる必要があるため、時間計算量は O(N^2) になります。次のように考えることができます。重複がないので、HashSet と HashMap の機能を考えることができます。 HashSet は Set インターフェイスを実装します。Set の数学的定義は、重複と順序のないコレクションです。 HashMap は Map を実装しており、重複したキーを許可しません。このようにして、HashMap または HashSet を使用してこれを実現できます。
HashMap を使用して実装する場合は、そのキーを配列に変換するだけで済みます。コードは次のとおりです。
次のようにコードをコピーします。
パッケージ cn.sunzn.randomnumber;
java.util.HashMapをインポートします。
java.util.Randomをインポートします。
パブリック クラス デモ {
public static void main(String[] args) {
オブジェクト[] 値 = 新しいオブジェクト[20];
ランダム ランダム = new Random();
HashMap<オブジェクト, オブジェクト> hashMap = new HashMap<オブジェクト, オブジェクト>();
/******* 乱数を生成し、HashMap に保存します *******/
for (int i = 0; i < 値.length; i++) {
int 数値 = ランダム.nextInt(100) + 1;
hashMap.put(番号, i);
}
/************ HashMap から配列をインポート************/
値 = hashMap.keySet().toArray();
/*********** 配列を走査してデータを出力します*************/
for (int i = 0; i < 値.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
HashSet と HashMap の関係が近すぎるため、最下層では HashMap を使用して実装されていますが、Value のコレクションはなく、Key のコレクションのみなので、HashSet を使用して実装することもできます。コードは次のとおりです。 :
次のようにコードをコピーします。
パッケージ cn.sunzn.randomnumber;
java.util.HashSet をインポートします。
java.util.Randomをインポートします。
パブリック クラス デモ {
public static void main(String[] args) {
ランダム ランダム = new Random();
オブジェクト[] 値 = 新しいオブジェクト[20];
HashSet<整数> hashSet = new HashSet<整数>();
/******* 乱数を生成し、HashSet に保存します *******/
for (int i = 0; i < 値.length; i++) {
int 数値 = ランダム.nextInt(100) + 1;
hashSet.add(数値);
}
値 = hashSet.toArray();
/************* 配列を走査し、データを出力します**********/
for (int i = 0; i < 値.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
この実装は若干効率的です。配列の長さを制限する場合は、for ループを変更して whlie ループに設定するだけで済みます。以下に示すように:
次のようにコードをコピーします。
パッケージ cn.sunzn.randomnumber;
java.util.HashSet をインポートします。
java.util.Randomをインポートします。
パブリック クラス デモ {
public static void main(String[] args) {
ランダム ランダム = new Random();
オブジェクト[] 値 = 新しいオブジェクト[20];
HashSet<整数> hashSet = new HashSet<整数>();
/****** 乱数を生成し、HashSet に保存します ******/
while (hashSet.size() < value.length) {
hashSet.add(random.nextInt(100) + 1);
}
値 = hashSet.toArray();
/************ 配列を走査してデータを出力します************/
for (int i = 0; i < 値.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}