3

我非常接近完成这项工作,我所需要的只是帮助使用数组从文本文件中找到五个最低值。我想出了如何找到五个最高值,但我找到最低值的最小数组总是输出五个 0。

输出://显然依赖于单个文本文件

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

总和是:1832

1775 14 9 9 7 //最大

0 0 0 0 0 //分钟

任何帮助深表感谢!

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]);

   }
}
4

5 回答 5

2

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

我建议您在内部循环之前使用 numbers[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++)
        {
于 2014-10-21T21:39:30.063 回答
1

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

System.out.println("numbers[i]的值是:" + 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;
            }

(更新)在 min 循环中,从 i=0 到 i=4 的 numbers[i] 在完成 max 循环后的值为 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])
        {...
于 2014-10-22T00:16:58.817 回答
0

你有2个问题。首先是由 Tom Elliott 解释的。

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

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

如果您不完全理解我所说的内容,请在找到 5 个最大值后尝试打印数字数组。

于 2014-10-21T22:29:31.770 回答
0

正如另一个答案所述,您的问题是您没有考虑从 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)寻找最大值

4)寻找分钟

我不确定您是否已经涵盖了函数,但是合并它的一个示例可能如下所示:

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

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

于 2014-10-21T21:58:29.787 回答
0

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

            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;
    }
于 2014-10-21T21:45:23.790 回答