Чтение файла и сохранение данных в массиве, а затем поиск минимального десятичного значения - PullRequest
0 голосов
/ 30 ноября 2009

Моя проблема в том, что я не могу найти способ правильно отобразить правильное значение для наименьшего значения населения и провинции, в которой оно есть. :

Напишите программу для чтения в файл данных провинции в массив называется ProvinceName и массив называется провинция населения. Вы можете Предположим, что есть 10 провинций. Написать цикл: прочитать данные в два массива. Проанализируйте массив, чтобы рассчитать общую численность населения все провинции. Напиши другой цикл, чтобы найти провинцию с Наименьшее население и распечатать, что название этой провинции.

Данные хранятся следующим образом (провинция Data.txt):

Ontario
12891787
Quebec
7744530
Nova Scotia
935962
New Brunswick
751527
Manitoba
1196291
British Columbia
4428356
PEI
139407
Saskatchewan
1010146
Alberta
3512368
NF/LB
508270

Вот мой код Java:

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

public class Slide50 
{
    public static void main(String[] args)throws IOException
    {
        File file = new File ("C:/provinceData.txt");
        Scanner in = new Scanner(file);
        int i = 0;      

        String province[] = new String[10];
        String lowProv = null;
        int pop[] = new int[10];        
        int totalPop = 0;
        int low = pop[0];

        //while there is data in the file to be processed       
        while(in.hasNext())
        {
            province[i] = in.nextLine();
            pop[i] = in.nextInt();

            //discard the \n on the line            
            in.nextLine();

            //regular processing goes here
            i++;
        }

        System.out.printf("\n\t%-16s %20s\n", "Province", "Population");
        System.out.printf("\t%-16s %20s\n", "========", "==========");  

        //print the province population report (which includes a total) using printf
        for (i = 0; i < pop.length; i++)
        {           
            System.out.printf("\t%-16s %,20d\n", province[i], pop[i]);      
            totalPop += pop[i];

            //find the province that has the smallest population 
            //and print out the province name and its population    
            if (pop[i] < low)
            {
                low = pop[i];                       
            }           
        }

        System.out.printf("\t%-16s %20s\n", "================", "==========");  
        System.out.printf("\t%-16s %,20d\n", "Total:", totalPop);                       
        System.out.println("\n\tThe province of " +  lowProv + " with a population of " +  low);
        System.out.println("\tis the least populated of all provinces.");   
    }
}

Вот мой пример запуска на основе этого кода:

Province                   Population
========                   ==========
Ontario                    12,891,787
Quebec                      7,744,530
Nova Scotia                   935,962
New Brunswick                 751,527
Manitoba                    1,196,291
British Columbia            4,428,356
PEI                           139,407
Saskatchewan                1,010,146
Alberta                     3,512,368
NF/LB                         508,270
================           ==========
Total:                     33,118,644

The province of null with a population of 0
is the least populated of all provinces.

Ответы [ 3 ]

1 голос
/ 30 ноября 2009

У вас есть две проблемы:

  1. Вы инициализируете low в ноль. low инициализируется сразу после создания pop, поэтому pop[0] по-прежнему равно 0. Я бы рекомендовал просто инициализировать его с помощью Integer.MAX_VALUE (или переместить в другое место).

  2. Вы не обновляете lowProv при обновлении значения low. Так что это всегда null.

0 голосов
/ 30 ноября 2009

Самый простой способ сделать это - найти минимум при цикле по файлу:

while (...) {
  province[i] = ...
  pop[i] = ...
  if (pop[i] < minpop) {
    minpop = pop[i];
    minprovince = province[i];
  }
  ...
}

Вы проделали большую часть пути со своим вторым циклом, но вы устанавливаете низкий уровень, чтобы быть первой записью в pop , прежде чем помещать что-либо в массив pop * , поэтому заполняйте значение с помощью что-то вроде Integer.MAX_VALUE.

0 голосов
/ 30 ноября 2009

Вы устанавливаете low равным 0. Установите вместо этого значение Integer.INT_MAX.

e: notnoop покрыл это. Но да, вам также нужно обновить lowProv

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...