如何从.TEXT文件填充数组而不在数组中放置任何重复项?

时间:2013-05-15 09:37:12

标签: java arrays duplicates text-files

Basicaly需要扫描这个文本文件把它放到一个数组但我不能放任何重复,所以它必须检查数组,看看数组是否已经包含该数字,我不能使用数组列表来做到这一点。 />

  我的程序输入一个数组,把它放到重复项,所以我如何捕获那些重复项来做其他事情并保持我的数组没有重复?

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();
                Arrays.sort(numbers);
                System.out.println(numbers[index]);
                //index++;
            }

        }
    }

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

3 个答案:

答案 0 :(得分:0)

如果对数组进行排序,代码可以进行二进制搜索。将此与条件if语句结合使用应确定是否应将元素插入到数组中。请注意,如果binarySearch找不到该元素,则会返回否定结果。

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) {
                int num = inputFile.nextInt();
                Arrays.sort(numbers);
                if(Arrays.binarySearch(numbers, num) < 0){
                    numbers[index] = inputFile.nextInt();
                }
                System.out.println(numbers[index]);
                // index++;
            }

        }
    }

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

答案 1 :(得分:0)

使用Set。每次从TXT文件中获取新号码时,都会将其添加到Set这样的

Set s = new Set();
int tmp;
...
while(inputFile.hasNextInt() && index < numbers.length) {
    tmp = inputFile.newtInt();
    if (!s.contains(tmp)) {
        s.add(tmp);
        numbers[index] = tmp;
        Arrays.sort(numbers);
        System.out.println(numbers[index]);
        //index++;
    }
}

您还应该考虑将Arrays.sort(numbers);移出while循环 除非您需要在每一步对数组进行排序。

答案 2 :(得分:0)

将TreeSet用于唯一且已排序的列表,并在将文件读取到数组后将其转换为:

    Set<Integer> set = new TreeSet<Integer>();
    while (inputFile.hasNextInt()) {
        int value = inputFile.nextInt();
        if (set.contains(value)) {
            // save value to dublicate's file
        }
        set.add(value);
    }
    Integer[] numbersInteger = set.toArray(new Integer[set.size()]);

结果numbersInteger将精确包含已排序且唯一的元素数。没有空元素,您不必在读取文件之前定义数组的大小。

如果你真的需要一个int而不是Integer的数组,那么你必须添加这些行:

    int[] numbers = new int[numbersInteger.length];
    for (int i = 0; i < numbersInteger.length; i++) {
        numbers[i] = numbersInteger[i];
    }