有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在数组中找不到五个最低值。。。最大值在最小数组未赋值时工作

我很快就要完成了,我所需要的只是通过使用数组从文本文件中找到五个最低值的帮助。我知道如何找到五个最高值,但我的最小数组找到最低值总是输出五个0

输出://显然取决于单个文本文件

文本文件中的数字总数为10

总数为:1832

17751497//max

0//min

非常感谢您的帮助

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

public class HW3
{
   public static void main(String[] args) throws IOException
   {
  File f = new File("integers.txt");
  Scanner fr = new Scanner(f);

    int sum = 0;
    int count = 0;
    int[] max = new int[5];
    int[] min = new int[5];
    int temp;

  while(fr.hasNextInt())
  {
        count++;        
        fr.nextInt();
  }

    Scanner fr2 = new Scanner(new File("integers.txt"));
    int numbers[] = new int[count];

    for(int i=0;i<count;i++)
  {
    numbers[i]=fr2.nextInt(); //fills array with the integers
  }

    for(int j:numbers)//get sum
    {
        sum+=j;
    }

    for (int j=0; j < 5; j++) //finds five highest
    {
        for (int i=0; i < numbers.length; i++)
            {
                if (numbers[i] > max[j])
                {
                    temp = numbers[i];
                    numbers[i] = max[j];
                    max[j] = temp;
                }
            }   
    }

    for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
    {
        for (int i=0; i < numbers.length; i++)
            {
                if (numbers[i] < min[j])
                {
                    temp = numbers[i];
                    numbers[i] = min[j];
                    min[j] = temp;
                }
            }   
    }

    System.out.println("Total amount of numbers in text file is " + count);
    System.out.println("Sum is: " + sum);
    System.out.println(max[0] + " " + max[1] + " " + max[2] + " " + max[3] + " " + max[4]);
    System.out.println(min[0] + " " + min[1] + " " + min[2] + " " + min[3] + " " + min[4]);

   }
}

共 (5) 个答案

  1. # 1 楼答案

    您的最小数组将被初始化为零值。所以数字中的值总是更高(假设没有负数)

    我建议在内部循环之前用数字[0]初始化min[j]

    for (int j=0; j < 5; j++) //finds five highest
    {
        min[j] = numbers[0]; // Add this line
        for (int i=0; i < numbers.length; i++)
            {
    
  2. # 2 楼答案

    你有两个问题。 首先由汤姆·艾略特解释

    第二个问题是max[]数组也是用0初始化的,当您搜索max值时,您将max数组中的值(即0)更改为numbers数组中的值,因此numbers数组将被0填充

    一个快速解决方法(虽然不是最好的)是将数字数组复制到临时数组中,并在搜索最小值时使用该临时数组

    如果您没有完全理解我说的话,请在找到5个最大值后尝试打印数字数组

  3. # 3 楼答案

    通过在嵌套的最小循环中输入以下行,尝试调试代码:

    System.out.println("the value of numbers[i] is: " + numbers[i]);

    看起来是这样的:

    for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
    {
        for (int i=0; i < numbers.length; i++)
            {
                if (numbers[i] < min[j])
                {
                    System.out.println("the value of numbers[i] is: " + numbers[i]);
                    temp = numbers[i];
                    numbers[i] = min[j];
                    min[j] = temp;
                }
            }   
    }
    

    你会注意到一些有趣的事情。最里面的嵌套零件甚至没有开始

    尝试将该行放入相应位置的嵌套max循环中。。。它将正常运行并显示最大数组值。因为(初始分配除外)嵌套的min循环的最内层没有启动,所以它无法运行,并且搜索的值没有分配给min数组,所以min数组的值为零

    如果尝试使用类似的行调试min循环的外部嵌套部分,则它们运行良好。这部分无法启动,并且出现了一些问题:

                if (numbers[i] < min[j])
                {
                    System.out.println("the value of numbers[i] is: " + numbers[i]);
                    temp = numbers[i];
                    numbers[i] = min[j];
                    min[j] = temp;
                }
    

    (更新) 在最小循环中,在完成最大循环后,从i=0到i=4的数字[i]的值为0

    您只需添加一行,并在min循环中使用int i=5而不是int i=0:

    for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
    {
        min[j] = max[4];                         // added line
        for (int i=5; i < numbers.length; i++)   // change to int i=5
        {
            if (numbers[i] < min[j])
            {...
    
  4. # 4 楼答案

    我只是好奇,你能不能直接排序(使用快速排序)选择前五名和后五名? -如果你能使用排序,我想这应该可以

                int sum = 0;
        int count = 0;
        int[] max =  {Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE};
        int[] min = {Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE};
        int temp;
        int visited[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        for (int j : numbers)// get sum
        {
            sum += j;
        }
    
        int tempindex;
    
        for (int j = 0; j < 5; j++) // finds five highest
        {
    
            for (int i = 0; i < numbers.length; i++) {
                if (visited[i] != 1) {
                    if (numbers[i] > max[j]) {
                        max[j] = numbers[i];
                        tempindex = i;
                    }
                }
            }
            visited[tempindex] = 1;
        }
    
        for (int j = 0; j < 5; j++) // finds five lowest...array not assigned
                                    // values
        {
            for (int i = 0; i < numbers.length; i++) {
                if (visited[i] != 1) {
                    if (numbers[i] < min[j]) {
                        min[j] = numbers[i];
                        tempindex = i;
                    }
                }
            }
            visited[tempindex] = 1;
        }
    
  5. # 5 楼答案

    正如另一个答案所述,您的问题是没有考虑从0开始的数组。在Java中,它为该数据结构设置默认值。对于基本体,这通常为0或false。但是,当您进入数据结构时,如果无法初始化对象,则会出现空指针异常问题。出于这个原因,我敦促您养成在使用数据结构之前在数据结构中设置值的习惯。这将在将来为您节省大量调试时间


    如果您事先知道这些值,可以使用{0,0,0,0,0}符号手动设置它们,也可以使用for循环进行初始化:

    for(int i = 0; i < array.length; i++)
    array[i] = init_value;
    

    我建议您也考虑尽可能多地进行整合。例如,在代码中,您对相同的数据进行了4次检查:

    1)将文件中的整数读入整数数组

    2)对整数数组中的所有数字求和

    3)寻找max

    4)寻找min

    我不确定您是否已经介绍了函数,但整合函数的一个示例可能如下所示:

    while(fr2.hasNextInt()){
    int i = fr2.nextInt();
    sum += i;
    checkHighest(i);
    checkLowest(i);
    }
    

    然后定义这些函数并将肉放在其他地方。这使您只需要担心一个地方的循环