【问题标题】:Create a set from a double value from an split string in an array从数组中拆分字符串的双精度值创建集合
【发布时间】:2021-03-05 09:49:54
【问题描述】:

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

例如,

我从气象站获得记录,其中包含值 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.");
}

【问题讨论】:

  • 我编辑了帖子,现在第一行有一张图片。
  • 将代码包含为文本而不是图像
  • 现已编辑。你能帮我创建一个 hashSet 吗?
  • 只有当那天的温度为零或低于零时,您才应该将日期添加到集合中。
  • 创建一个对数据建模的Class。然后做List&lt;ClassName&gt; model = new ArrayList();。然后循环遍历数据并执行for(...){model.add(new ClassName(address, year, date, ...); 之类的操作,然后您可以使用Stream 或循环查找所需的数据。

标签: java arrays string split duplicates


【解决方案1】:

您提到日期是独一无二的。根据情况,您可以通过以下简单步骤来完成:

  1. 将记录放入Map&lt;LocalDate, Double&gt;,以存储日期为键,温度为值。
  2. 迭代Map 值并计算发现温度小于零的次数。

演示:

// Put the records in a Map<LocalDate, Double>      
Map<LocalDate, Double> map = new HashMap<>();
for (int i = 0; i < weatherData.length; i++) {
    String line = weatherData[i];
    String[] data = line.split(",");
    int day = Integer.parseInt(data[6]);
    int month = Integer.parseInt(data[5]);
    int year = Integer.parseInt(data[4]);
    double temp = Double.parseDouble(data[9]);

    LocalDate date = LocalDate.of(year, month, day);

    map.put(date, temp);
}

// If you wish, you can print the map to view the datewise-records of temperature
System.out.println(map);

// Iterate the map values and count the number of times the temp < 0    
int count = 0;
for (Double value : map.values()) {
    if (value < 0) {
        count++;
    }
}

System.out.println("The temperature fell to 0.0 degrees or below in " + count + " days.");

【讨论】:

    【解决方案2】:

    终于!非常感谢你们的帮助,伙计们。

    我终于做到了。

    //How many days of the year did the temperature fall to 0.0 or below
        //anywhere in the UK? Hint : More than 200 but less than 250
        String[] weatherData = WeatherData.getData();
        
        double zeroTemp = 0.0;
        HashSet<LocalDate> set = new HashSet<>();
        // 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);
            
            if(zeroTemp >= temp) { 
            set.add(when);
                }
            }
        System.out.println("The temperature fell to 0.0 degrees or below in " + set.size()  + " days.");    
    }
    

    我只需要在 for 循环之外放置一个 HashSet,并且只有在温度低于或等于 0.0 时才输入一个新值

    我不知道我怎么看不到它。

    【讨论】:

    • 这种方法的严重问题是每次需要获取特定日期的温度时,都必须再次读取文件。相反,您应该只读取一次文件并将日期温度存储在Map 中。这样,每次您需要获取特定日期的温度时,您所要做的就是get it from the Map,而无需重新读取文件。万一,你检查过this answer吗?
    【解决方案3】:

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

    不是真的。

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

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

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

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

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

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

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

    【讨论】:

    • 我会尝试这样做。我相信它会是正确的。非常感谢您的帮助!
    • 我有点卡在 hashSet 上,它返回了重复的值。我将此添加到代码中:LocalDate when = LocalDate.of(year, month, date); System.out.println(when); Set&lt;LocalDate&gt; duplicateDates = new HashSet&lt;&gt;(Arrays.asList(when));
    • 我们的想法是在整个运行过程中使用一个 HashSet。不要使用单个值创建 800 个哈希集(假设您在该输入数据文件中有 800 行)- 创建一个哈希集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多