Tengo algunos problemas con un ejercicio actual en el que tengo que buscar una matriz de 1000 cadenas que se dividen por "," en siteId, siteName, año, mes, día, hora y temperatura. La información que necesito es un número entero, que es el día en que se registró, y un doble, que es la temperatura.
Por ejemplo,
Obtengo un registro de una estación meteorológica con los valores 3031,LOCH GLACARNOCH SAWS (3031),2015,01,01,18,7.50
Hasta ahora, he intentado hacer una lista de arreglos y así con las fechas, ya que no puede haber duplicados, pero no puedo encontrar la solución a la pregunta: ¿Cuántos días cayó la temperatura a 0.0 o menos en cualquier lugar del Reino Unido?
La variable año no es tan importante ya que los registros son solo de 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."); }La información que necesito es un número entero, que es el día en que se registró
Realmente no.
La entrada puede contener múltiples entradas para una sola fecha, en cuyo caso necesita saber la fecha completa (incluso si el año es irrelevante, hay mes + día; no puede simplemente mirar ese valor de 'día', o usted' d considerar el 1 de marzo y el 1 de abril como el mismo día, lo cual es claramente incorrecto.
O bien, no hay duplicados: para un día exacto dado, solo puede haber un único registro. Esto suena mal (dada la parte "¿o por debajo de cualquier parte del Reino Unido?"), Pero si es así, no necesita mirar el día o el mes en absoluto; simplemente cuente el número de entradas con un registro de temperatura por debajo de 0.
Puede modificarlo y convertir los campos de mes y día en un solo número entero único (multiplique el mes por 32, luego agregue los días: eso le garantiza un valor de ID único de 'mes + día', porque ningún mes tiene 32 días, la superposición no es posible ). O escríbalo correctamente y convierta ese campo año+mes+día en una instancia de LocalDate : LocalDate when = LocalDate.of(2015, 1, 1) produciría una instancia de LocalDate que representa el 1 de enero de 2015.
ArrayList no es una buena herramienta para la unicidad; probablemente esté buscando HashMap que asigna una 'clave' dada a un valor dado, o mejor aún, un HashSet , que almacena valores, pero que no almacenará el mismo valor más de una vez. A continuación, puede agregar cualquier LocalDate para el que haya encontrado un registro por debajo de cero, y si luego encuentra otro registro de este tipo, no cambiará nada, simplemente agregue la fecha al conjunto por segunda vez, ya que no lo hará. tener algún efecto. Luego, al final, simplemente verifique qué tan grande es el conjunto. Asi que:
LocalDate.of(year, month, day) . NB: line.split(",") tomará una línea de texto y devolverá una matriz de cadenas dividiendo la línea de entrada en cada coma. Integer.parseInt("50") devuelve el número 50.
Esta debería ser toda la información que necesitas para terminar tu tarea.
Has mencionado que las fechas son únicas. Según la condición, puede hacerlo con los siguientes pasos simples:
Map<LocalDate, Double> para almacenar la fecha como clave y la temperatura como valor.Map y cuente el número de veces que se encuentra que la temperatura es inferior a cero.Manifestación:
// 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.");¡Por fin! Muchas gracias por vuestra ayuda, chicos.
finalmente lo hice
//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."); }Solo tenía que poner un HashSet fuera del ciclo for y solo ingresar un nuevo valor si la temperatura era inferior o igual a 0.0
No sé cómo no pude verlo.