0

Iv 现在创建了一个数组,我必须从数组中删除重复项并将重复项写入 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。你不需要那么多。其次,如果你我们看看你的这两行代码:

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

然后我们必须问自己,if 语句的第一部分的目的是什么?如果i == 0 好吧,那只会在第一次通过时为真,所以 w 也将为 0。所以我们进入 if 的内部部分并且你设置numbers[0] = numbers[0] 不需要,所以我们可以删除i == 0你的 if 语句的一部分,因为它没有给我们带来任何好处。然后继续,您进入 while 循环并遍历所有输入文件并将所有随机数添加到您的 numbers 数组中。然后你回到 for 循环,i现在是 1,但你永远不会再通过while循环,因为索引太大,相反,你对你的wand做一些奇怪的事情inumbers在我看来你是环境numbers[1] = numbers[1], numbers[2] = numbers[2]等,除非你碰巧连续得到两个相同的随机数,在这种情况下你然后开始做numbers[3] = numbers[4]等。这一切都很奇怪,我肯定是不正确的。

所以你可能想要的更像是:

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

这将仅使用唯一数字填充您的 numbers 数组。然后对其进行排序以对数字进行排序。

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 回答