Java 如何在没有map或arraylist的情况下在数组中打印一次副本
我正在创建一个程序,其中导入一个.dat文件,并在命令提示符上打印值,以便读取。没问题。唯一的问题是我无法找出只打印某个变量一次的代码Java 如何在没有map或arraylist的情况下在数组中打印一次副本,java,arrays,Java,Arrays,我正在创建一个程序,其中导入一个.dat文件,并在命令提示符上打印值,以便读取。没问题。唯一的问题是我无法找出只打印某个变量一次的代码 import java.io.*; import java.util.Scanner; public class program4 { public static void main(String [] args) throws IOException { double [] valu
import java.io.*;
import java.util.Scanner;
public class program4
{
public static void main(String [] args) throws IOException
{
double [] values; //creating array called values
values = new double [40]; //establishing array that has 40 cells
int k; //creating counter integer
Scanner InputFile = new Scanner( new FileReader("temp.dat"));
k = 0;
while (InputFile.hasNextDouble()) //read values from file using ascending while loop
{
values[k] = InputFile.nextDouble();
k++;
}
for (k = 0 ; k < values.length ; k++)
System.out.println(values[k]);
InputFile.close();
}
}
初始化代码以清除.dat文件包含的重复项的最佳位置在哪里?创建一个方法,检查数组中是否存在一个值不止一次
boolean isDuplicate(double x, double[] array, int checkUpTo){
numOfOccurencies = 0;
for(int i = 0; i <= checkUpTo; i++)
if(x == array[i])
numOfOccurencies++;
return(numOfOccurencies > 1)? true : false;
}
然后
for (k = 0 ; k < values.length ; k++)
if(!isDuplicate(values[k], values, k)
System.out.println(values[k]);
因此,每次尝试打印数组中的double时,如果double出现多次,请检查该索引。这样,您可以保证至少打印一次所有内容。例如,如果在索引2和索引4处显示一个值,则首先在索引2处进行检查,因为您检查了该索引,所以该值不会重复并打印出来。在这之后,您最多检查4,并找到第二次发生,因此不会打印该值
希望这有帮助
编辑:我假设您只想在打印时消除重复项。如果不想存储重复的值,则需要类似的内容:
boolean isDuplicate(double x, double[] array){
for(int i = 0; i < array.length; i++)
if array[i] == x
return true;
return false;
}
while (InputFile.hasNextDouble()) //read values from file using ascending while loop
{
double temp = InputFile.nextDouble();
if(!isDuplicate(temp, values){
values[k] = temp
k++;
}
}
for (k = 0 ; k < values.length ; k++)
System.out.println(values[k]);
对程序最简单的修改是通过检查已存储的值,修改while循环以不存储重复项:
while (InputFile.hasNextDouble()) //read values from file using ascending while loop
{
double nextValue = InputFile.nextDouble();
// check to see if next value has already been stored
boolean duplicate = false;
for (int i=0; i<k; i++) {
if (nextValue == values[i]) {
duplicate = true;
break;
}
}
// only store values if they have not already been read
if (!duplicate) {
values[k] = nextValue;
k++;
}
}
一种方法是在构建数组后对其进行排序,并检查它是否具有重复值 当然,您可以在每次添加项时对其进行强制并循环整个数组,但这是非常低效的。下面的解决方案一开始也同样低效,但有优化的机会 我故意避免给出代码,因为我假设您想要学习,而不仅仅是复制粘贴 填充数组值后,在while循环之后,对数组进行排序。您可能已经知道如何从以前的练习中对数组进行排序,但如果您不知道,则该方法最容易学习,性能最差 有关简单的冒泡排序实现,请参见
function bubbleSort:
//values is your array
//length is the length of values
loop i from 0 to length - 1
loop j from i+1 to length - 1
if values[i] > values[j]
swap values[i] and values[j]
end if
end loop
end loop
end function
一旦有了一个排序的数组,循环遍历它并检查当前元素是否与前一个元素相同。如果是,那么它是一个副本
function removeDuplicates:
//values is your array
//non_duplicate_array is another array with only non duplicate values
loop from 1 to size-1 //and not from 0, because we are comparing
//an element with the previous and
//the element at 0 does not have a previous element
if values[i] == values[i-1]
//duplicate!
else
add element to non_duplicate_array.
end if
end loop
因此,我们:
填充已有的数组代码
分类
搜索并删除重复项
您可以构建的一个优化是确保排序本身具有重复消除:
这是上面气泡排序中最内层的循环:
loop j from i+1 to length - 1
if values[i] > values[j]
swap values[i] and values[j]
end if
end loop
在这里,您可以将值添加到另一个数组,而不是交换值,同时只执行非重复操作:
function bubbleSort:
//values is your array
//length is the length of values
//non_duplicate_array is another array that will eventually have
//sorted non duplicate values
loop i from 0 to length - 1
loop j from i+1 to length - 1
if values[i] != values[j]
if values[i] > values[j]
add values[j] to non_duplicate_array
else
add values[i] to non_duplicate_array
end if
end if
end loop
end loop
end function
排序是冒泡排序,因此非常复杂,特别是因为嵌套循环。但您可以用或快速排序来替换它。您可以调整合并或快速排序算法,以便删除重复项
仅当您对正在排序的输出数组满意时,此选项才起作用。否则,您需要对其进行暴力处理,如@xgeorgekx的回答所示。或者使用一个
编辑:
为了让您了解为什么会看到大量关于set的建议,以下是set所需的全部内容:
就这样。该集合将仅具有非重复值。但是你不会学习编程:- 好奇:你为什么不使用地图或数组列表呢?我们还没有在我的课程介绍级comp-sci中介绍过它,我的教授也不想让我们使用他没有教过的东西。当你每次打印之前都要遍历数组时,一种方法是先对数组排序,然后再搜索。那么这很简单,不是吗?如果它还不存在,请将它添加到数组中,然后立即或在最后打印出来。只有一个地方可以检查它是否已经在您的数据结构中,那就是在读取之后、添加到数组之前和打印之前。在布尔值中,您非常友好地发布了ty btw=D,如果数组[i]==x,那么x来自哪里?它是否是周长中提到的双精度?这是否是while语句中的双精度温度?是的,x是参数double x。尽管我刚刚注意到,在调用isDuplicate方法时,我也没有传递数组。我编辑了答案。所以这是正确的,如果!isDuplicatetemp,values etclat question=P编译时显示一个错误,在解析时说已到达结尾,这是否意味着我也必须在其他地方添加一个返回值?请检查是否有未关闭的返回值{。我最后一次编辑了答案。使用新的我终于完成了所有这些。但是现在它说我不能在静态方法中运行boolean isDuplicate。所以我将我的主方法切换到非静态方法,但随后出现了一个错误,说它需要是静态的。最后一个问题我保证lol
function bubbleSort:
//values is your array
//length is the length of values
//non_duplicate_array is another array that will eventually have
//sorted non duplicate values
loop i from 0 to length - 1
loop j from i+1 to length - 1
if values[i] != values[j]
if values[i] > values[j]
add values[j] to non_duplicate_array
else
add values[i] to non_duplicate_array
end if
end if
end loop
end loop
end function
Set valueSet = new HashSet<Double>();
...
...
while (InputFile.hasNextDouble())
{
valueSet.add(InputFile.nextDouble());
}