排除数组中的重复值(Java)

时间:2014-12-16 16:00:16

标签: java arrays

对于作业,我必须从文件中读取值,并在屏幕上打印它们,除非它们是重复值。我的方法是创建两个具有相同值的数组,然后以某种方式比较它们,如果它们不相等,则不会打印。这就是我所拥有的:

import java.io.*;
import java.util.Scanner;

public class Set8_Prog4
{
    public static void main (String[] args) throws IOException
    {
        FileReader i = new FileReader("Set8_Prog4 numbers.txt");
        Scanner j = new Scanner(i);

        int length = 0;
        while (j.hasNextInt())
        {
            length++;
        }
        int[] values = new int[length];
        int[] values2 = new int[length];
        int k = 0;
        while (j.hasNextInt())
        {
            values[k] = j.nextInt();
            k++;
        }
        k = 0;
        while (j.hasNextInt())
        {
            values2[k] = j.nextInt();
            k++;
        }
        k = 0;
        int m = 0;
        while (values[k] != values2[m] && k < values.length)
        {
            while (m < values.length)
            {
                m++;
            }
            System.out.println(values[k]);
            k++;
        }
        j.close();
    }
}

它编译,但你可能会告诉它没有完成工作。我一直在努力想弄清楚如何让它发挥作用。我可以使用一些帮助。哦,我们不能使用数组列表,Hashsets或类似的东西。只是阵列。

更新代码:

import java.io.*;
import java.util.Scanner;

public class Set8_Prog4
{
    public static void main (String[] args) throws IOException
    {
        FileReader i = new FileReader("Set8_Prog4 numbers.txt");
        Scanner j = new Scanner(i);

        int length = 0;
        while (j.hasNextInt())
        {
            length++;
        }
        int[] values = new int[length];
        int[] values2 = new int[length];
        int k = 0;
        while (j.hasNextInt())
        {
            values[k] = j.nextInt();
            k++;
        }
        k = 0;
        while (j.hasNextInt())
        {
            values2[k] = j.nextInt();
            k++;
        }
        int m;
        for (k = values.length; k >= 0; k--)
        {
            boolean found = false;
            for (m = 0; m < values.length; m++)
            {
                if ((values[k] == values2[m]) && (k != m))
                {
                    found = true;
                    continue;
                }
                if (!found)
                {
                    System.out.println(values[k]);
                }
            }
        }
    }
}

我跑的时候什么都没得到。虽然没有错误。

4 个答案:

答案 0 :(得分:2)

您可以在打印时为数组添加值,每次打印下一个值时都要检查,如果打印不打印,请确保它不在数组中,如果不打印则添加数组的值。你应该只需要一个数组。

答案 1 :(得分:0)

好的,所以这里有一个示例方法,它将向数组添加值,只有当它们不存在时才会存在:

// int[] array containing values
// value currently being added
// index where the value is currently being added
void addValueWithoutDuplication(int[] array, int value, int index) {
    for(int i = 0; i < index; i++) {     // iterate over all the values that are currently in the array
        if(array[i] == value) {          // if the value we are adding is a duplicate of a value in the array 
            return;                      // return out of this method and don't add the value
        }
    }
    array[index] = value;                // if we reached this point, value is not a duplicate and we can add it to the array at the index
}

如果使用此方法添加每个值,则数组将不包含任何重复项,然后您可以迭代数组并打印值。

答案 2 :(得分:0)

基本上,您从未正确地将values[k]values2[m]进行比较,因为当您这样做时,m始终等于values.length()

将嵌套的while循环更改为以下内容:

for (int k=0; k < values.length; k++) {
    boolean found = false;
    for (int m=0; m < values.length; m++) 
        if ((values[k] == values2[m]) && (k != m)) {
           found = true;
           continue;
        }
    if (!found)
        System.out.println(values[k]);
}

或者,为了更有效的代码(和更好的标记),检查从文件中读取数组时是否存在整数。如果整数已经存在,则不要将其添加到数组中,否则,请执行此操作。正如另一个答案所述,这种方法只需要1个数组,因此效率更高。

提高分数的另一个提示 - 考虑一下您的变量名称(valuesvalues2并不是很棒的名字)

答案 3 :(得分:0)

由于valuesvalues2具有完全相同的内容,并且您设置了k = 0m = 0,因此您永远不会真正进入您的while循环while (values[k] != values2[m] && k < values.length)。另外(如果你继续使用你当前的方法),一旦你弄清楚你需要为while循环迭代什么,考虑这样一个事实:一旦你进入那个循环,m来自得到你的索引进入数组一直到values.length 可能或者在下次测试while (values[k] != values2[m] && k < values.length)时可能不会抛出一个边界索引异常:)因为这是作业,我&# 39;让你想出其余部分。