逐一扫描元素并进行比较

时间:2019-11-10 13:20:57

标签: java

我必须为我的编程课做一些功课。任务是将文本文档作为简短程序的输入,并删除所有重复的数字并打印出这些单个数字。当两个数字紧跟在一起时,这很好用,但是一旦三个或三个以上,我的程序就会将它们视为“新”数字,从而打印出错误的答案。

我已经尝试使用两个读取相同文件的扫描仪,但是似乎无法使用不同的扫描仪两次扫描一个文件。 我通常会使用java.util.ArrayList来执行此任务,但是我们不允许使用它,因为在我们的讲座中还没有使用它。 我可以对其进行扩展,使其能够相互比较三个数字,但这会使程序过于复杂。似乎必须有一种更简单的方法。

    Scanner scanner1 = new Scanner(System.in);
    boolean hasPrinted = false;

    while(scanner1.hasNext()){

        int x = scanner1.nextInt();
        if(scanner1.hasNext()){
            int y = scanner1.nextInt();
            if(x != y){
                System.out.println(x);
                System.out.println(y);
                hasPrinted = true;
            }
        }
        if(!hasPrinted) System.out.println(x);
        hasPrinted = false; 
    }

输入为:java RemoveDuplicates

当文本文档为1 8 3 3 5 4 4 4 9之类的文本时,预期输出为1 8 3 5 4 9。我得到的输出是1 8 3 5 4 4 9

非常感谢。

2 个答案:

答案 0 :(得分:0)

我们也处理1 8 3 3 5 4 4 4 8 8盒。 基本上,我们有一个整数数组。而且,如果在运行时我们意识到数组不够大,可以用更大的数组替换它。


final static int BLOCK = 1024;

// How we expamd our array. I use arraycopy which is much faster than a loop
// if you're not allowed to use it, resort to a simple loop.
static Integer expand(Integer[] source) {
   Integer[] expanded = new Integer[source.length + BLOCK];
   System.arraycopy(source, 0, expanded, 0, source.length);
   return expanded;
}

// ....

Integer[] alreadySeen = new Integer[BLOCK]; // not int[], to allow nulls.
bailout:
while(scanner1.hasNext()){
        int x = scanner1.nextInt();
        int i; // we need this out of loop context too.

        for(i = 0; i< alreadySeen.length; i++)
            if(alreadySeen[i] == null)
                 break; // nothing furthur too look for.
            else if(Objects.equals(alreadySeen[i], (Integer) x))
                  continue bailout; // yes, we have seen it, bail out.

        // If we have reached here, we didn't hit "continue" up there and it's a new number

        if(i == alreadySeen.length) // overflow, allocate more
             alreadySeen = expand(alreadySeen);
        alreadySeen[i] = x;
        System.out.println(x);
  }

我们在这里实现的是效率低下的ArrayList。

答案 1 :(得分:0)

尝试使用ArrayList:

ArrayList<Integer> alreadyPrinted = new ArrayList<>();
while(scanner.hasNext()){
    int number = scanner.nextInt();
    if (!alreadyPrinted.contains(number)){
         System.out.print(number);
         alreadyPrinted.add(number);
    }
}