对于作业,我必须从文件中读取值,并在屏幕上打印它们,除非它们是重复值。我的方法是创建两个具有相同值的数组,然后以某种方式比较它们,如果它们不相等,则不会打印。这就是我所拥有的:
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]);
}
}
}
}
}
我跑的时候什么都没得到。虽然没有错误。
答案 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个数组,因此效率更高。
提高分数的另一个提示 - 考虑一下您的变量名称(values
和values2
并不是很棒的名字)
答案 3 :(得分:0)
由于values
和values2
具有完全相同的内容,并且您设置了k = 0
和m = 0
,因此您永远不会真正进入您的while循环while (values[k] != values2[m] && k < values.length)
。另外(如果你继续使用你当前的方法),一旦你弄清楚你需要为while循环迭代什么,考虑这样一个事实:一旦你进入那个循环,m
来自得到你的索引进入数组一直到values.length
可能或者在下次测试while (values[k] != values2[m] && k < values.length)
时可能不会抛出一个边界索引异常:)因为这是作业,我&# 39;让你想出其余部分。