Определение минимальных и максимальных двойных значений из файла - PullRequest
1 голос
/ 25 января 2012

Я читаю статистику землетрясения из файла, и мне нужно иметь возможность определить минимальное и максимальное значения магнитуд. Есть около 831 величин. Я попытался создать локальные переменные double max = Double.MAX_VALUE; double min = Double.MIN_VALUE; и сравнить их со значениями двойной величины, которые я извлекаю из файла, но когда я возвращаю значение, оно просто дает мне самые низкие и самые высокие значения для любого двойного значения. Вот мой код до сих пор.

Данные из файла примера:

1.6,"Southern California","Wednesday, January 18, 2012 19:19:12 UTC"
1.8,"Southern California","Wednesday, January 18, 2012 19:03:00 UTC"
1.8,"Southern California","Wednesday, January 18, 2012 18:46:53 UTC"
4.7,"Bonin Islands, Japan region","Wednesday, January 18, 2012 18:20:40 UTC"
1.6,"Southern California","Wednesday, January 18, 2012 17:58:07 UTC"
1.0,"Northern California","Wednesday, January 18, 2012 17:48:03 UTC"
5.2,"Santa Cruz Islands","Wednesday, January 18, 2012 17:26:02 UTC"
import java.util.*;
import java.io.*;

public class QuakeStates2 
{       

    public static void main(String[] args) throws IOException
        {       
            double count = 0.0;
            double mag = 0.0;
            double total = 0.0;
            double average = 0.0;
            double max = Double.MAX_VALUE;
            double min = Double.MIN_VALUE;
            String area = null;
            String date = null;


            Scanner keyboard = new Scanner(System.in); //Setup the Keyboard scanner
            System.out.print("Enter the filename: "); // User input for the filename

            String filename = keyboard.nextLine();  //Scanner stores the file name as a String Value

            File file = new File(filename);         //File turns the Scanner input into a file
            Scanner inputFile = new Scanner(file);  //inputFile holds the file info and Reads up to the comma

            while (inputFile.hasNextLine()) 
            {
                String line = inputFile.nextLine();
                count++;
                StringTokenizer str = new StringTokenizer(line);

                if (str.hasMoreTokens())
                    {
                    mag = Double.parseDouble(str.nextToken(",")); 
                    area = str.nextToken();
                    date = str.nextToken("\\w");
                    //System.out.println(mag);
                    //System.out.println(area);
                    //System.out.println(date);
                    }
                if ( mag > max)
                {
                    max = mag;
                }

                if ( mag < min)
                {
                    min = mag;
                }
                total = mag+total;
                average = total/count;

            }

            inputFile.close();

            System.out.println("# of Lines in the file: " + count);
            System.out.println("Sum of Magnitudes: " + total);
            System.out.println("Average Magnitude: " + average);
            System.out.println("Max Magnitude: " + max);
            System.out.println("Min Magnitude: " + min);


        }

    }

Результаты:

Enter the filename: C:\Users\Owner\Desktop\workspace\QuakeStatistics\quakes1.2012.txt
# of Lines in the file: 821.0
Sum of Magnitudes: 1747.0000000000007
Average Magnitude: 2.127892813641901
Max Magnitude: 1.7976931348623157E308
Min Magnitude: 4.9E-324

Ответы [ 3 ]

5 голосов
/ 25 января 2012

Попробуйте изменить это:

double max = Double.MAX_VALUE;
double min = Double.MIN_VALUE;

к этому:

double max = -Double.MAX_VALUE;
double min = Double.MAX_VALUE;

В конце концов, если вы начнете думать, что уже видели MAX_VALUE как наивысшее, вы никогда не увидите ничего большего , чем это, не так ли?

EDIT: обратите внимание на использование -Double.MAX_VALUE здесь вместо Double.MIN_VALUE. MIN_VALUE является наименьшим положительным числом, тогда как я предполагаю, что вы действительно хотите "наиболее сильно отрицательное конечное значение".

Вы хотите, чтобы первое прочитанное вами значение заменило max и min. Альтернативой было бы использовать Double вместо этого, чтобы представить «отсутствующее» значение с нуля, чтобы начать с:

Double max = null;
Double min = null;

if (max == null || mag > max)
{
    max = mag;
}
// Ditto for min

Что касается стиля, я бы только вычислил среднее значение после прочтения всего ввода - вы многократно перезаписываете значение без всякой причины. Единственная причина не делать этого - избегать думать о случае, когда count равен 0 (т. Е. Пустой файл), но в любом случае я бы лично обработал это отдельно - когда у вас нет значений, просто нет средний.

3 голосов
/ 25 января 2012

не используйте Double.MIN_VALUE, это не то, что вы ожидаете

Double.MIN_VALUE - это не отрицательное число. Double.MIN_VALUE - это очень маленькое число, его 4.9e-324; // 0x0.0000000000001P-1022

Сравнение с ним прекратится, как только вы используете отрицательные числа

Небольшой служебный класс, который я написал, чтобы помочь с этим:

public class MinMaxUtil<T extends Comparable<T>>
{
  private T minimum;
  private T maximum;

  public MinMaxUtil()
  {
    reset();
  }

  public void check( T value)
  {
    if ( minimum == null || value.compareTo(minimum) < 0  )
      minimum = value;
    if ( maximum == null || value.compareTo(maximum) > 0 )
      maximum = value;
  }

  public void check( T [] values )
  {
    for (T value : values)
      {
      check(value);
      }
  }

  public void check( Collection<T> values )
  {
    for (T value : values)
      {
      check(value);
      }
  }

  public T getMinimum()
  {
    return minimum;
  }

  public T getMaximum()
  {
    return maximum;
  }

  public void reset()
  {
    minimum = null;
    maximum = null;
  }

  @Override
  public String toString()
  {
    return "MinMaxUtil{"+
        "minimum="+minimum+
        ", maximum="+maximum+
        '}';
  }
}
2 голосов
/ 25 января 2012

Изменить

double max = Double.MAX_VALUE;
double min = Double.MIN_VALUE;

на

double max = Double.MIN_VALUE;
double min = Double.MAX_VALUE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...