Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有map或arraylist的情况下在数组中打印一次副本_Java_Arrays - Fatal编程技术网

Java 如何在没有map或arraylist的情况下在数组中打印一次副本

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

我正在创建一个程序,其中导入一个.dat文件,并在命令提示符上打印值,以便读取。没问题。唯一的问题是我无法找出只打印某个变量一次的代码

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());
    }