Java 确定文件中的最小和最大双精度值

Java 确定文件中的最小和最大双精度值,java,file-io,Java,File Io,我正在从文件中读取地震统计数据,我需要能够确定震级的最小值和最大值。大约有831个震级。我试图创建一个本地double max=double.max\u值;双最小值=双最小值变量并将其与我从文件中提取的双倍量值进行比较,但当我返回值时,它只会为任何双倍值提供最低和最高值。这是到目前为止我的代码 文件中的数据示例: 1.6,"Southern California","Wednesday, January 18, 2012 19:19:12 UTC" 1.8,"Southern Californi

我正在从文件中读取地震统计数据,我需要能够确定震级的最小值和最大值。大约有831个震级。我试图创建一个本地
double max=double.max\u值;双最小值=双最小值变量并将其与我从文件中提取的双倍量值进行比较,但当我返回值时,它只会为任何双倍值提供最低和最高值。这是到目前为止我的代码

文件中的数据示例:

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" 1.6,“南加州”,“2012年1月18日星期三19:19:12 UTC” 1.8,“南加州”,“2012年1月18日星期三19:03:00 UTC” 1.8,“南加州”,“2012年1月18日星期三18:46:53 UTC” 4.7,“日本博宁群岛地区”,“2012年1月18日星期三18:20:40 UTC” 1.6,“南加州”,“2012年1月18日星期三17:58:07 UTC” 1.0,“北加利福尼亚州”,“2012年1月18日星期三17:48:03 UTC” 5.2,“圣克鲁斯群岛”,“2012年1月18日星期三17:26:02 UTC”
import java.util.*;
导入java.io.*;
公开课教友会2
{       
公共静态void main(字符串[]args)引发IOException
{       
重复计数=0.0;
双磁极=0.0;
双倍合计=0.0;
双平均=0.0;
双倍最大值=双倍最大值;
双最小值=双最小值;
字符串区域=空;
字符串日期=空;
扫描仪键盘=新扫描仪(System.in);//设置键盘扫描仪
System.out.print(“输入文件名:”;//用户输入文件名
String filename=keyboard.nextLine();//扫描仪将文件名存储为字符串值
File File=新文件(filename);//文件将扫描仪输入转换为文件
Scanner inputFile=new Scanner(file);//inputFile保存文件信息并读取到逗号
while(inputFile.hasNextLine())
{
String line=inputFile.nextLine();
计数++;
StringTokenizer str=新的StringTokenizer(行);
if(str.hasMoreTokens())
{
mag=Double.parseDouble(str.nextToken(“,”);
面积=str.nextToken();
日期=str.nextToken(\\w”);
//系统输出打印项次(mag);
//系统输出打印LN(面积);
//系统输出打印项次(日期);
}
如果(磁感应>最大值)
{
max=mag;
}
如果(磁感应<分钟)
{
最小值=mag;
}
总计=磁极+总计;
平均数=总数/计数;
}
inputFile.close();
System.out.println(“文件中的行数:+count”);
System.out.println(“震级之和:+总计”);
System.out.println(“平均震级:+平均值”);
System.out.println(“最大幅值:+Max”);
System.out.println(“最小幅值:+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 输入文件名:C:\Users\Owner\Desktop\workspace\QuakeStatistics\quakes1.2012.txt #文件中的行数:821.0 震级之和:1747.0000000000007 平均震级:2.127892813641901 最大震级:1.7976931348623157E308 最小震级:4.9E-324 改变

改变

尝试更改此选项:

double max = Double.MAX_VALUE;
double min = Double.MIN_VALUE;
为此:

double max = -Double.MAX_VALUE;
double min = Double.MAX_VALUE;
毕竟,如果你一开始就认为你已经看到了
MAX\u VALUE
的最高值,那么你永远不会看到比这更大的值,是吗

编辑:注意此处使用的是
-Double.MAX\u值
,而不是
Double.MIN\u值
MIN_值
是最小的正数,而我假设您真的想要“最强的负有限值”

您希望读取的第一个值同时替换
max
min
。另一种方法是使用
Double
,以null开头表示“缺失”值:

Double max = null;
Double min = null;

if (max == null || mag > max)
{
    max = mag;
}
// Ditto for min
作为一个样式问题,我也只会在读取整个输入后计算平均值——您会无缘无故地重复覆盖该值。不这样做的唯一原因是避免考虑
count
为0(即一个空文件)的情况,但我个人会单独处理-当您没有值时,就没有平均值。

尝试更改此情况:

double max = Double.MAX_VALUE;
double min = Double.MIN_VALUE;
为此:

double max = -Double.MAX_VALUE;
double min = Double.MAX_VALUE;
毕竟,如果你一开始就认为你已经看到了
MAX\u VALUE
的最高值,那么你永远不会看到比这更大的值,是吗

编辑:注意此处使用的是
-Double.MAX\u值
,而不是
Double.MIN\u值
MIN_值
是最小的正数,而我假设您真的想要“最强的负有限值”

您希望读取的第一个值同时替换
max
min
。另一种方法是使用
Double
,以null开头表示“缺失”值:

Double max = null;
Double min = null;

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

作为一个样式问题,我也只会在读取整个输入后计算平均值——您会无缘无故地重复覆盖该值。不这样做的唯一原因是避免考虑
count
为0(即一个空文件)的情况,但我个人会单独处理-当您没有值时,就没有平均值。

不要使用Double.MIN\u值这不是您期望的值

Double.MIN_值它不是一个负数Double.MIN_值是一个非常小的数字它是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+
        '}';
  }
}
公共类MinMaxUtil
{
私人T最小值;
脉波重复间隔