0

配列を作成したので、配列から重複を削除し、重複をtxtファイルに書き込み、この乱数を上位から下位に並べる必要がありますが、少なくとも誰かがそれらの重複整数を取得する方法を教えてくれれば配列を複製し、すでに完璧な変数に複製を入れます。これは私のコードです。ありがとうございました!配列リストがありません。

import java.util.Random;
import java.io.*;
import java.lang.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Scanner;
public class MainProg extends GenKeys {

    public static void main(String[] args) {
        //int x = random();
        try {

            BufferedWriter out = new BufferedWriter(new FileWriter("file.txt"));


            for (int z = 0; z < 500; z++) {
                int x = random();
                out.write(x + System.getProperty("line.separator"));
            }
            out.close();

            readFromfile();
        } catch (IOException e) {
            System.out.print(e);
        }
    }

    public static void readFromfile() throws IOException {
        int[] numbers = new int[500];
        int result, searchValue;

        int index = 0;

        // Open the file.
        File file = new File("file.txt");
        Scanner inputFile = new Scanner(file);
        int w = 0;
        for (int i = 0; i < numbers.length; i++) {
            if (i == 0 || numbers[i] != numbers[i - 1]) {
                numbers[w++] = numbers[i];

                while (inputFile.hasNextInt() && index < numbers.length) {

                    numbers[index] = inputFile.nextInt();
                    System.out.println(numbers[index]);
                    index++;
                }
            }
        }

        // Close the file.
        inputFile.close();
    }
}

GenKeys メソッド

 import java.util.Random;

public class GenKeys {

static int x;


public static int random(){
for (int i = 0; i < 250; i++) {

 x = (int) (Math.random() * 250);

}

return x;




}
}
4

2 に答える 2

2

整数を配列に格納する代わりに、HashSet<Integer>.

交換int[] numbers = new int[500];

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

呼び出されたすべてのメソッドをSetnumbersで使用可能なメソッドに置き換えます。

于 2013-05-14T23:43:20.920 に答える
0

まず最初に、奇妙なコードがあります。これは機能するかもしれませんが、それでも非常に奇妙です。それでは、ループ コードをクリーンアップすることから始めましょう。

まず、カウント変数が多すぎます。インデックス、w、および i が表示されます。そんなに多くは必要ありません。次に、次の 2 行のコードを見ると、次のようになります。

if (i == 0 || numbers[i] != numbers[i - 1]) {
                numbers[w++] = numbers[i];

次に、if ステートメントの最初の部分の目的は何かを自問する必要があります。i == 0 それは初めての場合にのみ true になるため、w も 0 になります。そのため、if の内部部分に到達し、必要のない設定を行うため、if ステートメントnumbers[0] = numbers[0] の一部を削除できます。i == 0それは私たちに何も得ていません。次に、while ループに入り、すべての入力ファイルを調べて、すべての乱数を数値配列に追加します。次に、 for ループに戻り、i現在は 1 ですが、whileインデックスが大きすぎるため、ループを再び通過することはありwません。設定inumbersnumbers[1] = numbers[1], numbers[2] = numbers[2]ただし、たまたま連続して同じ 2 つの乱数を取得した場合は除きます。その場合は、numbers[3] = numbers[4]ect を実行し始めます。それはすべて非常に奇妙で、私は間違っていると確信しています。

したがって、おそらく必要なのは、もう少し次のようなものです。

index = 0;
while (inputFile.hasNextInt() && index < numbers.length) {   
    numbers[index] = inputFile.nextInt();
    System.out.println(numbers[index]);
    index++;
}

これにより、数値配列に一意の数値のみが入力されます。次に、並べ替えを行って番号を並べ替えます。

Arrays.sort(numbers);

次に、重複を調べて削除します。

for (int i = 0, j = 0; i < numbers.length; i = j > i ? j : i + 1) {
    boolean duplicate = false;
    j = i;
    do {
       if (j + 1 >= numbers.length) {
           break;
       }
       duplicate = false;
       if (numbers[i] == numbers[j + 1]) {
           numbers[j + 1] = -1; // setting it to negative 1 so we know it's "removed"
           duplicate = true;
           j++;
       }
    } while (duplicate);
}

これで、新しい配列を作成して正の値のみを入力して読み取るか、既存の配列を使用して残りの数値を出力することができます。

于 2013-05-15T16:05:40.490 に答える