2012-01-25 8 views
1

Я читаю статистику землетрясения из файла, и мне нужно определить значения Мин и Макс. есть около 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 

ответ

2

Изменить

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

в

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

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

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 (т. Е. Пустой файл), но я лично лично буду разбираться с этим отдельно - когда у вас нет значений, просто нет среднего.

+0

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

+0

@Peter: Очень хорошая точка :) –

+0

легко запомнить, если вы допустили ошибку: D – Peter

3

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

Double.MIN_VALUE его не отрицательное число Double.MIN_VALUE является очень небольшой nummber его 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+ 
     '}'; 
    } 
} 
+0

@ Peter.Я знаю, что это как-то поздно, но это имеет большое значение, сравнивая его с нулевым. Спасибо! – handro

Смежные вопросы