java—从数组中拆分的字符串的双精度值创建一个集合

xmd2e60i  于 2021-07-11  发布在  Java
关注(0)|答案(3)|浏览(298)

我对当前的一个练习有一些问题,在这个练习中,我必须查找一个由1000个字符串组成的数组,这些字符串按“,”拆分为siteid、sitename、year、month、day、hour和temperature。我需要的信息是一个整数,也就是记录的日期,还有一个双倍的温度。
例如,
我从一个气象站得到一个值为3031的记录,loch glacarnoch saws(3031),2015,01,01,18,7.50
到目前为止,我已经试着做了一个数组列表和日期,因为不可能有重复的,但在中找不到问题的解决办法:多少天的温度下降到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.");

}

yzxexxkh

yzxexxkh1#

我需要的信息是一个整数,也就是记录的日期
不是真的。
输入可能包含单个日期的多个条目,在这种情况下,您需要知道整个日期(即使年不相关,也有月+日;你不能只看“日”值,否则你会认为3月1日和4月1日是同一天,这显然是不正确的。
或者,没有重复:对于任何给定的确切日期,只能有一条记录。这听起来是错误的(考虑到“或以下任何地方在英国?”部分),但如果是这样,你不需要看一天或一个月;只需计算温度记录低于0的条目数。
你可以破解它,把月和日字段变成一个唯一的整数(将月乘以32,然后加上天:这保证你有一个唯一的'month+day'id值,因为没有一个月有32天,重叠是不可能的)。或者正确地写下它,并将“年+月+日”字段转换为 LocalDate 示例: LocalDate when = LocalDate.of(2015, 1, 1) 将生成表示2015年1月1日的localdate示例。
arraylist不是唯一性的好工具;你可能在找 HashMap 它将一个给定的“键”Map到一个给定的值,或者更好的是,Map到一个 HashSet ,它存储值,但不会多次存储相同的值。然后,您可以添加任何localdate,其中您发现一条记录在零下,如果您随后找到另一条这样的记录,您不会更改任何内容—只需再次将日期添加到集合中,因为它不会产生任何效果。然后在最后检查一下这个集合有多大。所以:
创建localdate的哈希集。
对于每个记录:编写代码,将年、月和日值转换为localdate,使用 LocalDate.of(year, month, day) .
检查温度值是否低于0.0。如果是这样的话,把你做的日期加进去。
当完成循环时,集合的大小表示英国任何地方温度低于0的天数。
注意: line.split(",") 将获取一行文本并通过在每个逗号处拆分输入行来返回字符串数组。 Integer.parseInt("50") 返回数字50。
这应该是你完成作业所需要的全部信息。

o75abkj4

o75abkj42#

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

//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时才输入一个新值
我不知道我怎么看不见。

elcex8rz

elcex8rz3#

你提到日期是独一无二的。根据情况,您可以通过以下简单步骤完成:
把记录放进 Map<LocalDate, Double> 存储日期作为键,存储温度作为值。
迭代 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.");

相关问题