无法在数组中找到五个最低值...最大值在min数组未分配值时有效

时间:2014-10-21 21:33:51

标签: java arrays highest

我非常接近完成此操作,我需要的是通过使用数组从文本文件中找到五个最低值的帮助。我想出了如何找到五个最高值,但我找到最低值的min数组总是输出五个0' s。

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

文本文件中的总数量为10

总和是:1832

1775 14 9 9 7 //最大

0 0 0 0 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 个答案:

答案 0 :(得分:2)

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

我建议您在内循环之前使用数字[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++)
        {

答案 1 :(得分:1)

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

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

你会发现一些有趣的东西。最里面的嵌套部分甚至没有启动。

尝试将该行放入其各自位置的嵌套最大循环中......并且它将正常运行并显示最大数组值。你得到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的数字[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])
        {...

答案 2 :(得分: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;
    }

答案 3 :(得分: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);
}

然后定义这些功能并将肉放在别处。这让你只需要在一个地方担心循环。

答案 4 :(得分:0)

你有两个问题。 汤姆·艾略特(Tom Elliott)解释了第一个问题。

第二个问题是max []数组也初始化为0,当你搜索最大值时,你用数字数组中的值更改max array(即0)的值,所以数字数组变得充满了0。

快速解决(尽管不是最好的)是将数字数组复制到临时数组中,并在搜索最小值时使用该数据。

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