【问题标题】:How to check values over and under certain predetermined limits如何检查超过和低于某些预定限制的值
【发布时间】:2019-04-03 19:15:47
【问题描述】:

首先,我要感谢这个社区,虽然我来这里的时间不长,但我很感激它的每一点。

我正在做一个学校项目,我想除了最后一点之外,我大部分时间都弄明白了。当然,您可以随时就您看到的任何内容提供任何建议,但我的主要问题如下。

我很难打印出来: 我是否应该使用循环(例如布尔值)来测试发布的值是否为真?

投资业绩指标计数: 一种。 As 数量:价值 1250 美元或更高 湾。 B 数量:价值 1100 美元或更高且低于 1500 美元 C。 Cs 数量:价值 900 美元或更高且低于 1100 美元 d。 Ds 数量:价值 750 美元或更高,且低于 900 美元 e. Fs 数量:价值低于 750 美元

最后,再次感谢大家的耐心和理解。我真的很想了解它是如何工作的,所以如果你能解释一下它是如何工作的,我真的很感激。

程序调用文本文件中值的最小值、最大值和平均值。只需提供一些帮助信息。(我已经这样做了)

到目前为止,我已经尝试过循环来测试这些值,我不确定我做得对,但它对我不起作用。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class Prog07_InvestmentManager {

    public static void main(String[] args) {

    Scanner in = new Scanner(System.in);    
    Scanner inFile=null;;
    File file=null;
    boolean flag=true;
    while(flag) {
        try {
            flag=false;
            System.out.println("Please enter the file name to import, including file extension."); //prompt user
            file = new File(in.nextLine()); //store user input in variable
            inFile = new Scanner(new FileReader(file)); //read file
        } 
        catch (FileNotFoundException e1) {
            flag=true;
        }
    }

    double min = Integer.MAX_VALUE;
    double max = 0;
    double mean = 0;
    inFile.nextLine();

    double line = 0;
    int sum = 0;
    int count = 0;

    while (inFile.hasNextLine()) {

        line=inFile.nextDouble();
        sum+=line;
        count++;

        if(line>max)
            max=line;

        if(line<min)
            min=line;
    }
    mean = (sum/count);
    System.out.printf("Max: %-4.2f\n", max);
    System.out.printf("Min: %-4.2f\n", min);
    System.out.printf("Mean: %-4.2f\n", mean);
    System.out.println();

    if (in.hasNextDouble()) {

    double[] values = new double [(int) in.nextDouble()];

    }

    try {
        Scanner inputFile = new Scanner(file);

        double[] arr = new double[(int) in.nextDouble()];

        for (int i = 0; in.hasNextDouble(); i++) {
            arr[i] = in.nextDouble();
        }

    } catch (FileNotFoundException e) {
        file = new File("investments.txt");
        System.out.print("File not found.\nPlease enter the correct path if needed.");
        file = new File(in.nextLine());                 
        }
    in.close();
    }
}

【问题讨论】:

  • 能否附上示例文件或示例输入数据?
  • 什么意思?类似于: if (max >= 1250) { do stuff? }
  • 要求不明确。顺便说一句,有更好的选择来获取统计信息。 List inputList = new ArrayList(); while (inFile.hasNextLine()) { line=inFile.nextDouble(); inputList.add(line); } DoubleSummaryStatistics stats = inputList .stream() .mapToDouble(Double::doubleValue) .summaryStatistics(); System.out.println("平均:" + stats.getAverage());
  • 我很感激,不幸的是我们还没有涵盖数组列表,所以我不能用它来做这个。很抱歉不太清楚,我基本上想做的是打印出有多少个 A(值超过 1250),以及有多少个 B(值 1100+,但小于 1500)等。

标签: java arrays list loops printf


【解决方案1】:

如果您只是想打印每个类别(A、B、...)的频率,我可能会使用 java 的 HashMap 创建频率图。您可以为每个类别分配键,然后为每次出现的值分配值给每个键。你可以用 Java 8+ 变得很花哨

你可以这样做:

String key;
HashMap<String, Integer> freqMap = new HashMap<>();

while(inFile.hasNextLine()) {
    if(inFile.hasNextDouble()) {
        Double nextDouble = inFile.nextDouble();
        if(nextDouble >= 1250.0) {
            key = A;
            //either create a new key in the HashMap for A, B, etc. or increment the  
            //value associated with the existing key by one
            freqMap.merge(key, 1, Integer::sum);  
        }
        //we are going to use separate if statements as it appears that values can be in 
        //more than one category
        if(nextDouble < 1500.0 && nextDouble >= 1100.0) {
            key = B;
            freqMap.merge(key, 1, Integer::sum);  
        }
        and so on...
    }
}

最后,您将遍历 HashMap 并打印键和值。如果您需要更多详细信息,请告诉我。

编辑:此方法不需要数组结构。但是,如果您要遍历数组来构建地图而不是从文件中接收数据,请将 while 循环更改为遍历数组的 for 循环。

【讨论】:

  • 哇!我们还没有介绍过 HashMap,这真的很酷。那么这个程序在每个 if 语句中逐行执行,直到结束?那么如果值是 1250 或更高,它会将其存储在 A 中吗?只是想理解它,很抱歉打扰你。
  • 我在最后添加了一些清晰度,但是通过 while 循环或 for 循环,我们希望遍历我们的 inFile 或我们的数组并使用 hashmap 结构构建频率图。然后我们可以打印频率图的内容。 HashMap 是为此类问题而构建的。使用 if's 而不是 if-else if 可以确保如果一个数组条目可以包含在多个类别中,那么它会在地图中为每只猫进行统计。它属于。
  • 此外,这不会将实际值存储在地图中,而是存储值如何满足给定类别的标准。这样您就可以打印 A = 5、B = 3 等。
  • 这太好了,我唯一不明白的是:Hashmap freqMap();抛出一个语法错误,因为这是我第一次看到这个我不知道为什么。
  • 这里很好地解释了如何在地图中打印键和值:stackoverflow.com/a/5920157
猜你喜欢
  • 2020-03-23
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多