首页 > 解决方案 > 从数组中拆分字符串的双精度值创建集合

问题描述

我在当前的练习中遇到了一些问题,我必须查看由“,”分割成 siteId、siteName、年、月、日、小时和温度的 1000 个字符串的数组。我需要的信息是一个整数,即记录的日期,以及一个双精度数,即温度。

例如,

我从气象站获得了记录,其值为 3031,LOCH GLACARNOCH SAWS (3031),2015,01,01,18,7.50

到目前为止,我已经尝试制作一个 arrayList 等日期,因为不能有重复,但 In 找不到问题的解决方案:英国任何地方的温度下降到 0.0 或以下有多少天?

年份变量并不重要,因为记录仅来自 2015 年。

String[] weatherData = WeatherData.getData();

    double zeroTemp = 0.0;
    int counter = 0;
    // get the data
            
    
    for (int i = 1; i <= weatherData.length-1; i++) {
        
        String line = weatherData[i];
        String[] data = line.split(",");
        int date = Integer.parseInt(data[6]);
        int month = Integer.parseInt(data[5]);
        int year = Integer.parseInt(data[4]);
        double temp = Double.parseDouble(data[9]);
            
        LocalDate when = LocalDate.of(year, month, date);
        
        for(int j = 1; j<= data.length; j++) {
        HashSet<LocalDate> duplicateDates = new HashSet<>(Arrays.asList(when));
        System.out.println(when);
          duplicateDates.add(when);
        
        System.out.println(duplicateDates.size());
        }
        if(zeroTemp >= temp) { 
            counter++;      
            }
        }
        System.out.println("The temperature fell to 0.0 degrees or below in " + counter  + " days.");
}

标签: javaarraysstringsplitduplicates

解决方案


我需要的信息是一个整数,就是记录的日期

并不真地。

输入可能包含单个日期的多个条目,在这种情况下,您需要知道整个日期(即使年份无关紧要,也有月 + 日;您不能只查看“日”值,或者您d 将 3 月 1 日和 4 月 1 日视为同一天,这显然是不正确的。

或者,没有重复:对于任何给定的确切日期,都只能有一条记录。这听起来是错误的(考虑到“或在英国的任何地方?”部分),但如果是这样,您无需查看日期或月份;只需计算温度记录低于 0 的条目数。

您可以破解它并将月份和日期字段转换为单个唯一整数(将月份乘以 32,然后添加天数:这可以保证您拥有唯一的“月+日”ID 值,因为没有一个月有 32 天,重叠是不可能的)。或者正确地编写它并将那个年+月+日字段转换为一个LocalDate实例:LocalDate when = LocalDate.of(2015, 1, 1)将生成一个表示 2015 年 1 月 1 日的 LocalDate 实例。

ArrayList 不是唯一性的好工具;您可能正在寻找HashMap将给定“键”映射到给定值的映射,或者更好的是 a HashSet,它存储值,但不会多次存储相同的值。然后,您可以添加在零以下找到记录的任何 LocalDate ,如果您随后找到另一个这样的记录,您不会更改任何内容 - 只需再次将日期添加到集合中,因为它不会有什么影响。然后在最后只检查集合有多大。所以:

  1. 创建一个 LocalDate 的 HashSet。
  2. 对于每条记录:编写将年、月和日值转换为 LocalDate 的代码,使用LocalDate.of(year, month, day).
  3. 检查温度值是否低于 0.0。如果是这样,请将您制作的日期添加到集合中。
  4. 完成循环后,集合的大小表示英国任何地方温度低于 0 的天数。

注意:line.split(",")将获取一行文本并通过在每个逗号处拆分输入行来返回一个字符串数组。Integer.parseInt("50")返回数字 50。

这应该是完成作业所需的所有信息。


推荐阅读