From 3dd44b333e58605f146c775e22ab4decd57223ab Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:39:46 +0000 Subject: [PATCH 01/22] Setting up GitHub Classroom Feedback From 583ffb746ae23ef290a1ad3904a7358ba2167769 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Fri, 19 Sep 2025 16:26:36 +0200 Subject: [PATCH 02/22] uppdaterad --- src/main/java/com/example/Main.java | 5 + src/test/java/com/example/MainTest.java | 162 ++++++++++++++---------- 2 files changed, 99 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 20a692ac..5b0865b5 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -5,5 +5,10 @@ public class Main { public static void main(String[] args) { ElpriserAPI elpriserAPI = new ElpriserAPI(); + + + + + } } diff --git a/src/test/java/com/example/MainTest.java b/src/test/java/com/example/MainTest.java index 6199d951..c61f3589 100644 --- a/src/test/java/com/example/MainTest.java +++ b/src/test/java/com/example/MainTest.java @@ -43,7 +43,8 @@ void getPriser_shouldReturnParsedPrices_whenMockDataIsProvided() { [{"SEK_per_kWh":0.12229,"EUR_per_kWh":0.01112,"EXR":10.997148,"time_start":"2025-09-04T00:00:00+02:00","time_end":"2025-09-04T01:00:00+02:00"},{"SEK_per_kWh":0.09886,"EUR_per_kWh":0.00899,"EXR":10.997148,"time_start":"2025-09-04T01:00:00+02:00","time_end":"2025-09-04T02:00:00+02:00"},{"SEK_per_kWh":0.09095,"EUR_per_kWh":0.00827,"EXR":10.997148,"time_start":"2025-09-04T02:00:00+02:00","time_end":"2025-09-04T03:00:00+02:00"},{"SEK_per_kWh":0.04201,"EUR_per_kWh":0.00382,"EXR":10.997148,"time_start":"2025-09-04T03:00:00+02:00","time_end":"2025-09-04T04:00:00+02:00"},{"SEK_per_kWh":0.04146,"EUR_per_kWh":0.00377,"EXR":10.997148,"time_start":"2025-09-04T04:00:00+02:00","time_end":"2025-09-04T05:00:00+02:00"},{"SEK_per_kWh":0.04465,"EUR_per_kWh":0.00406,"EXR":10.997148,"time_start":"2025-09-04T05:00:00+02:00","time_end":"2025-09-04T06:00:00+02:00"},{"SEK_per_kWh":0.32991,"EUR_per_kWh":0.03,"EXR":10.997148,"time_start":"2025-09-04T06:00:00+02:00","time_end":"2025-09-04T07:00:00+02:00"},{"SEK_per_kWh":0.47123,"EUR_per_kWh":0.04285,"EXR":10.997148,"time_start":"2025-09-04T07:00:00+02:00","time_end":"2025-09-04T08:00:00+02:00"},{"SEK_per_kWh":0.68182,"EUR_per_kWh":0.062,"EXR":10.997148,"time_start":"2025-09-04T08:00:00+02:00","time_end":"2025-09-04T09:00:00+02:00"},{"SEK_per_kWh":0.4125,"EUR_per_kWh":0.03751,"EXR":10.997148,"time_start":"2025-09-04T09:00:00+02:00","time_end":"2025-09-04T10:00:00+02:00"},{"SEK_per_kWh":0.29571,"EUR_per_kWh":0.02689,"EXR":10.997148,"time_start":"2025-09-04T10:00:00+02:00","time_end":"2025-09-04T11:00:00+02:00"},{"SEK_per_kWh":0.06136,"EUR_per_kWh":0.00558,"EXR":10.997148,"time_start":"2025-09-04T11:00:00+02:00","time_end":"2025-09-04T12:00:00+02:00"},{"SEK_per_kWh":0.03662,"EUR_per_kWh":0.00333,"EXR":10.997148,"time_start":"2025-09-04T12:00:00+02:00","time_end":"2025-09-04T13:00:00+02:00"},{"SEK_per_kWh":0.0375,"EUR_per_kWh":0.00341,"EXR":10.997148,"time_start":"2025-09-04T13:00:00+02:00","time_end":"2025-09-04T14:00:00+02:00"},{"SEK_per_kWh":0.26822,"EUR_per_kWh":0.02439,"EXR":10.997148,"time_start":"2025-09-04T14:00:00+02:00","time_end":"2025-09-04T15:00:00+02:00"},{"SEK_per_kWh":0.30429,"EUR_per_kWh":0.02767,"EXR":10.997148,"time_start":"2025-09-04T15:00:00+02:00","time_end":"2025-09-04T16:00:00+02:00"},{"SEK_per_kWh":0.36675,"EUR_per_kWh":0.03335,"EXR":10.997148,"time_start":"2025-09-04T16:00:00+02:00","time_end":"2025-09-04T17:00:00+02:00"},{"SEK_per_kWh":0.58296,"EUR_per_kWh":0.05301,"EXR":10.997148,"time_start":"2025-09-04T17:00:00+02:00","time_end":"2025-09-04T18:00:00+02:00"},{"SEK_per_kWh":0.92145,"EUR_per_kWh":0.08379,"EXR":10.997148,"time_start":"2025-09-04T18:00:00+02:00","time_end":"2025-09-04T19:00:00+02:00"},{"SEK_per_kWh":1.5054,"EUR_per_kWh":0.13689,"EXR":10.997148,"time_start":"2025-09-04T19:00:00+02:00","time_end":"2025-09-04T20:00:00+02:00"},{"SEK_per_kWh":1.00888,"EUR_per_kWh":0.09174,"EXR":10.997148,"time_start":"2025-09-04T20:00:00+02:00","time_end":"2025-09-04T21:00:00+02:00"},{"SEK_per_kWh":0.63179,"EUR_per_kWh":0.05745,"EXR":10.997148,"time_start":"2025-09-04T21:00:00+02:00","time_end":"2025-09-04T22:00:00+02:00"},{"SEK_per_kWh":0.56382,"EUR_per_kWh":0.05127,"EXR":10.997148,"time_start":"2025-09-04T22:00:00+02:00","time_end":"2025-09-04T23:00:00+02:00"},{"SEK_per_kWh":0.52951,"EUR_per_kWh":0.04815,"EXR":10.997148,"time_start":"2025-09-04T23:00:00+02:00","time_end":"2025-09-05T00:00:00+02:00"}]"""; // 2. Set the mock response using the static method. - ElpriserAPI.setMockResponse(fakeJson); + LocalDate today = LocalDate.of(2025, 9, 4); + ElpriserAPI.setMockResponseForDate(today,fakeJson); // 3. Create an instance of the class as a student would. ElpriserAPI api = new ElpriserAPI(false); // Disable caching for predictable tests @@ -109,7 +110,8 @@ void displayMeanPrice_withValidData() { {"SEK_per_kWh":0.30,"EUR_per_kWh":0.03,"EXR":10.0,"time_start":"2025-09-04T02:00:00+02:00","time_end":"2025-09-04T03:00:00+02:00"}, {"SEK_per_kWh":0.40,"EUR_per_kWh":0.04,"EXR":10.0,"time_start":"2025-09-04T03:00:00+02:00","time_end":"2025-09-04T04:00:00+02:00"}]"""; - ElpriserAPI.setMockResponse(mockJson); + LocalDate today = LocalDate.of(2025, 9, 4); + ElpriserAPI.setMockResponseForDate(today,mockJson); Main.main(new String[]{"--zone", "SE3", "--date", "2025-09-04"}); @@ -127,7 +129,8 @@ void displayMinMaxPrices_withValidData() { {"SEK_per_kWh":0.80,"EUR_per_kWh":0.08,"EXR":10.0,"time_start":"2025-09-04T02:00:00+02:00","time_end":"2025-09-04T03:00:00+02:00"}, {"SEK_per_kWh":0.30,"EUR_per_kWh":0.03,"EXR":10.0,"time_start":"2025-09-04T03:00:00+02:00","time_end":"2025-09-04T04:00:00+02:00"}]"""; - ElpriserAPI.setMockResponse(mockJson); + LocalDate today = LocalDate.of(2025, 9, 4); + ElpriserAPI.setMockResponseForDate(today,mockJson); Main.main(new String[]{"--zone", "SE1", "--date", "2025-09-04"}); @@ -144,13 +147,22 @@ void displayMinMaxPrices_withValidData() { @Test void displaySortedPrices_whenRequested() { - String mockJson = """ - [{"SEK_per_kWh":0.30,"EUR_per_kWh":0.03,"EXR":10.0,"time_start":"2025-09-04T00:00:00+02:00","time_end":"2025-09-04T01:00:00+02:00"}, - {"SEK_per_kWh":0.10,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"2025-09-04T01:00:00+02:00","time_end":"2025-09-04T02:00:00+02:00"}, - {"SEK_per_kWh":0.20,"EUR_per_kWh":0.02,"EXR":10.0,"time_start":"2025-09-04T02:00:00+02:00","time_end":"2025-09-04T03:00:00+02:00"}, - {"SEK_per_kWh":0.10,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"2025-09-04T03:00:00+02:00","time_end":"2025-09-04T04:00:00+02:00"}]"""; + // This test ensures charging window can span days when next day data exists + LocalDate today = LocalDate.of(2025, 9, 4); + LocalDate tomorrow = today.plusDays(1); - ElpriserAPI.setMockResponse(mockJson); + String mockJsonToday = """ + [{"SEK_per_kWh":0.30,"EUR_per_kWh":0.03,"EXR":10.0,"time_start":"2025-09-04T20:00:00+02:00","time_end":"2025-09-04T21:00:00+02:00"}, + {"SEK_per_kWh":0.10,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"2025-09-04T21:00:00+02:00","time_end":"2025-09-04T22:00:00+02:00"}, + {"SEK_per_kWh":0.20,"EUR_per_kWh":0.02,"EXR":10.0,"time_start":"2025-09-04T22:00:00+02:00","time_end":"2025-09-04T23:00:00+02:00"}, + {"SEK_per_kWh":0.10,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"2025-09-04T23:00:00+02:00","time_end":"2025-09-04T00:00:00+02:00"}]"""; + String mockJsonTomorrow = """ + [{"SEK_per_kWh":0.10,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"2025-09-05T00:00:00+02:00","time_end":"2025-09-05T01:00:00+02:00"}, + {"SEK_per_kWh":0.15,"EUR_per_kWh":0.015,"EXR":10.0,"time_start":"2025-09-05T01:00:00+02:00","time_end":"2025-09-05T02:00:00+02:00"}, + {"SEK_per_kWh":0.15,"EUR_per_kWh":0.015,"EXR":10.0,"time_start":"2025-09-05T02:00:00+02:00","time_end":"2025-09-05T03:00:00+02:00"}]"""; + + ElpriserAPI.setMockResponseForDate(today, mockJsonToday); + ElpriserAPI.setMockResponseForDate(tomorrow, mockJsonTomorrow); Main.main(new String[]{"--zone", "SE2", "--date", "2025-09-04", "--sorted"}); @@ -158,10 +170,13 @@ void displaySortedPrices_whenRequested() { // Expected sorted output (ascending by price) List expectedOrder = List.of( - "01-02 10,00 öre", - "03-04 10,00 öre", - "02-03 20,00 öre", - "00-01 30,00 öre" + "20-21 30,00 öre", + "22-23 20,00 öre", + "01-02 15,00 öre", + "02-03 15,00 öre", + "21-22 10,00 öre", + "23-00 10,00 öre", + "00-01 10,00 öre" ); // Extract actual lines that match the pattern @@ -183,7 +198,9 @@ void findOptimalCharging2Hours() { {"SEK_per_kWh":0.15,"EUR_per_kWh":0.015,"EXR":10.0,"time_start":"2025-09-04T03:00:00+02:00","time_end":"2025-09-04T04:00:00+02:00"}, {"SEK_per_kWh":0.30,"EUR_per_kWh":0.03,"EXR":10.0,"time_start":"2025-09-04T04:00:00+02:00","time_end":"2025-09-04T05:00:00+02:00"}]"""; - ElpriserAPI.setMockResponse(mockJson); + LocalDate today = LocalDate.of(2025, 9, 4); + + ElpriserAPI.setMockResponseForDate(today, mockJson); Main.main(new String[]{"--zone", "SE3", "--date", "2025-09-04", "--charging", "2h"}); @@ -204,7 +221,9 @@ void findOptimalCharging4Hours() { {"SEK_per_kWh":0.20,"EUR_per_kWh":0.02,"EXR":10.0,"time_start":"2025-09-04T04:00:00+02:00","time_end":"2025-09-04T05:00:00+02:00"}, {"SEK_per_kWh":0.30,"EUR_per_kWh":0.03,"EXR":10.0,"time_start":"2025-09-04T05:00:00+02:00","time_end":"2025-09-04T06:00:00+02:00"}]"""; - ElpriserAPI.setMockResponse(mockJson); + LocalDate today = LocalDate.of(2025, 9, 4); + + ElpriserAPI.setMockResponseForDate(today, mockJson); Main.main(new String[]{"--zone", "SE1", "--date", "2025-09-04", "--charging", "4h"}); @@ -223,7 +242,9 @@ void chargingWindowDoesNotUseNextDay_whenNextDayUnavailable() { [{"SEK_per_kWh":0.20,"EUR_per_kWh":0.02,"EXR":10.0,"time_start":"2025-09-04T00:00:00+02:00","time_end":"2025-09-04T01:00:00+02:00"}, {"SEK_per_kWh":0.10,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"2025-09-04T01:00:00+02:00","time_end":"2025-09-04T02:00:00+02:00"}, {"SEK_per_kWh":0.15,"EUR_per_kWh":0.015,"EXR":10.0,"time_start":"2025-09-04T02:00:00+02:00","time_end":"2025-09-04T03:00:00+02:00"}]"""; - ElpriserAPI.setMockResponse(mockJsonToday); + LocalDate today = LocalDate.of(2025, 9, 4); + ElpriserAPI.setMockResponseForDate(today,mockJsonToday); + Main.main(new String[]{"--zone", "SE3", "--date", "2025-09-04", "--charging", "2h"}); String output = bos.toString(); // Best 2h window should be 01-03 (0.10 + 0.15) @@ -235,7 +256,7 @@ void chargingWindowDoesNotUseNextDay_whenNextDayUnavailable() { void findOptimalCharging8Hours() { // Create mock data with 12 hours to allow for 8-hour window StringBuilder jsonBuilder = new StringBuilder("["); - double[] prices = {0.50, 0.10, 0.05, 0.15, 0.08, 0.12, 0.06, 0.09, 0.25, 0.30, 0.35, 0.40}; + double[] prices = {0.50, 0.10, 0.05, 0.15, 0.08, 0.12, 0.06, 0.09, 0.25, 0.30, 0.35, 0.40, 0.50, 0.10, 0.05, 0.15, 0.08, 0.12, 0.06, 0.09, 0.25, 0.30, 0.35, 0.40}; for (int i = 0; i < prices.length; i++) { if (i > 0) jsonBuilder.append(","); @@ -243,12 +264,20 @@ void findOptimalCharging8Hours() { Locale.US, """ {"SEK_per_kWh":%.2f,"EUR_per_kWh":%.3f,"EXR":10.0,"time_start":"2025-09-04T%02d:00:00+02:00","time_end":"2025-09-04T%02d:00:00+02:00"}""", - prices[i], prices[i] / 10, i, i + 1 + prices[i], prices[i] / 10, i, (i + 1) % 24 )); } jsonBuilder.append("]"); - ElpriserAPI.setMockResponse(jsonBuilder.toString()); + LocalDate today = LocalDate.of(2025, 9, 4); + ElpriserAPI.setMockResponseForDate(today, jsonBuilder.toString()); + + LocalDate tomorrow = today.plusDays(1); + String mockJsonTomorrow = """ + [{"SEK_per_kWh":0.1,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"2025-09-05T00:00:00+02:00","time_end":"2025-09-05T01:00:00+02:00"}, + {"SEK_per_kWh":0.15,"EUR_per_kWh":0.015,"EXR":10.0,"time_start":"2025-09-05T01:00:00+02:00","time_end":"2025-09-05T02:00:00+02:00"}, + {"SEK_per_kWh":0.15,"EUR_per_kWh":0.015,"EXR":10.0,"time_start":"2025-09-05T02:00:00+02:00","time_end":"2025-09-05T03:00:00+02:00"}]"""; + ElpriserAPI.setMockResponseForDate(tomorrow, mockJsonTomorrow); Main.main(new String[]{"--zone", "SE4", "--date", "2025-09-04", "--charging", "8h"}); @@ -359,66 +388,63 @@ void chargingWindowSpansToNextDay_whenCheapestCrossesMidnight() { } @Test - public void testHourlyMinMaxPrices() { - List quarterHourPrices = new ArrayList<>(); - - // Simulate 96 prices: 24 hours, each with 4 quarter-hour prices - for (int i = 0; i < 96; i++) { - quarterHourPrices.add((double) (i % 24)); // repeating hourly pattern - } + void testHourlyMinMaxPrices_with96Entries() { + // --- ARRANGE --- + LocalDate today = LocalDate.of(2025, 9, 4); + StringBuilder jsonBuilder = new StringBuilder("["); - // Expected hourly averages - List hourlyAverages = new ArrayList<>(); - for (int i = 0; i < 24; i++) { - double sum = 0; - for (int j = 0; j < 4; j++) { - sum += quarterHourPrices.get(i * 4 + j); + for (int hour = 0; hour < 24; hour++) { + for (int quarter = 0; quarter < 4; quarter++) { + if (hour > 0 || quarter > 0) { + jsonBuilder.append(","); + } + double price = (hour * 0.1) + (quarter * 0.01) + 0.10; + String time_start = String.format("2025-09-04T%02d:%02d:00+02:00", hour, quarter * 15); + String time_end = String.format("2025-09-04T%02d:%02d:00+02:00", hour, (quarter + 1) * 15); + if (quarter == 3) { // Handle end of hour + time_end = String.format("2025-09-04T%02d:00:00+02:00", (hour + 1) % 24); + } + + jsonBuilder.append(String.format(Locale.US, + """ + {"SEK_per_kWh":%.4f,"EUR_per_kWh":0.01,"EXR":10.0,"time_start":"%s","time_end":"%s"}""", + price, time_start, time_end)); } - hourlyAverages.add(sum / 4.0); } + jsonBuilder.append("]"); + ElpriserAPI.setMockResponseForDate(today, jsonBuilder.toString()); - double expectedMin = Collections.min(hourlyAverages); - double expectedMax = Collections.max(hourlyAverages); + // --- ACT --- + Main.main(new String[]{"--zone", "SE3", "--date", "2025-09-04"}); - // Call your method under test - PriceRange result = PriceCalculator.calculateHourlyMinMax(quarterHourPrices); + // --- ASSERT --- + String output = bos.toString(); + assertThat(output).containsIgnoringCase("lägsta pris"); + assertThat(output).containsIgnoringCase("högsta pris"); + assertThat(output).containsIgnoringCase("medelpris"); - assertThat(result.getMin()).isCloseTo(expectedMin, within(0.001)); - assertThat(result.getMax()).isCloseTo(expectedMax, within(0.001)); + // Expected Min: Hour 0 -> avg(0.10, 0.11, 0.12, 0.13) = 0.115 SEK/kWh = 11,50 öre + // Expected Max: Hour 23 -> avg(2.40, 2.41, 2.42, 2.43) = 2.415 SEK/kWh = 241,50 öre + assertThat(output).contains("00-01"); // Cheapest hour + assertThat(output).contains("23-00"); // Most expensive hour + assertThat(output).contains(formatOre(0.115)); + assertThat(output).contains(formatOre(2.415)); + + // Calculate overall average for the day + double totalSum = 0; + for (int hour = 0; hour < 24; hour++) { + for (int quarter = 0; quarter < 4; quarter++) { + totalSum += (hour * 0.1) + (quarter * 0.01) + 0.10; + } + } + double expectedMean = totalSum / 96; + assertThat(output).contains("Medelpris: " + formatOre(expectedMean) + " öre"); } private String formatOre(double sekPerKWh) { double ore = sekPerKWh * 100.0; - DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(Locale.of("sv", "SE")); + DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("sv", "SE")); DecimalFormat df = new DecimalFormat("0.00", symbols); return df.format(ore); } -} -class PriceRange { - private final double min; - private final double max; - - public PriceRange(double min, double max) { - this.min = min; - this.max = max; - } - - public double getMin() { return min; } - public double getMax() { return max; } -} - -class PriceCalculator { - public static PriceRange calculateHourlyMinMax(List quarterHourPrices) { - List hourlyAverages = new ArrayList<>(); - for (int i = 0; i < 24; i++) { - double sum = 0; - for (int j = 0; j < 4; j++) { - sum += quarterHourPrices.get(i * 4 + j); - } - hourlyAverages.add(sum / 4.0); - } - double min = Collections.min(hourlyAverages); - double max = Collections.max(hourlyAverages); - return new PriceRange(min, max); - } } \ No newline at end of file From d93086e8b7c4fcdc15c3d916aa3ce5b7bf47f271 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Sun, 21 Sep 2025 20:01:45 +0200 Subject: [PATCH 03/22] =?UTF-8?q?P=C3=A5b=C3=B6rjat=20laboration,=20metode?= =?UTF-8?q?r=20och=20output=20f=C3=B6r=20--help?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 75 ++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 5b0865b5..dca76bce 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -2,13 +2,84 @@ import com.example.api.ElpriserAPI; +import java.time.LocalDate; +import java.util.Map; + public class Main { public static void main(String[] args) { - ElpriserAPI elpriserAPI = new ElpriserAPI(); - + System.out.println("Välkommen till Elpris-kollen!"); + ElpriserAPI elpriserApi = new ElpriserAPI(); + + + //en if - sats för att tolka olika argument, key = variabeln för argument som samlats i args[] + if(containsArg(args, "--help")) { + helpMe(); + //programmet avslutas efter visad text i output + } + if(containsArg(args, "--date")) { + String date = getArgValue(args, "--date"); + LocalDate idag = LocalDate.now(); + System.out.println("Datum: " + idag); + } + + + } + + // metod för att gå igenom och letar efter valt argument i innehållet i args[] + //key är en variabel för argumentet i kommandotolken + //behövs för om man har arument utan värde, Kollar om ett argument finns + + /*args[]: alla argument från kommandoraden +- key: det argument du letar efter, t.ex. "--zone"*/ + + + public static boolean containsArg(String[] args, String key) { + for(String arg : args) { + if (arg.equalsIgnoreCase(key)) { + return true; + } } + return false; + } + + public static String getArgValue(String[] args, String key) { + for (int i = 0; i < args.length -1 ; i++) { + if (args[i].equalsIgnoreCase(key)) { + return args[i+1]; + } + } + return null; + } + +// metod för --help att skickas till if-sats +public static void helpMe() { + System.out.println(""" + Hjälpcenter + ______________________ + + Användning: + java -cp target/classes com.example.Main [alternativ] + + Alternativ: + --zone SE1|SE2|SE3|SE4 (obligatoriskt) Välj elpris-zon + --date YYYY-MM-DD (valfritt) Välj datum, t.ex. 2025-09-21 + --charging 2h|4h|8h (valfritt) Hitta billigaste laddningsfönster + --sorted (valfritt) Sortera priser fallande + --help (valfritt) Visa denna hjälptext + + Exempel: + java Main --zone SE3 --charging 4h + """); } + +} + + + + + + From 7f2cb1082a0e8721667bd0316c57aba9782d7d46 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 24 Sep 2025 14:29:00 +0200 Subject: [PATCH 04/22] hejhej --- src/main/java/com/example/Main.java | 112 ++++++++++++++++++++++++---- 1 file changed, 99 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index dca76bce..efc5c900 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -2,7 +2,10 @@ import com.example.api.ElpriserAPI; +import java.time.DateTimeException; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class Main { @@ -11,27 +14,95 @@ public static void main(String[] args) { System.out.println("Välkommen till Elpris-kollen!"); ElpriserAPI elpriserApi = new ElpriserAPI(); - - //en if - sats för att tolka olika argument, key = variabeln för argument som samlats i args[] - if(containsArg(args, "--help")) { - helpMe(); - //programmet avslutas efter visad text i output + String zoneOf = null; + String dateOf = null; + String chargeOf = null; + boolean isHelped = false; + + List validZones = new ArrayList<>(); + validZones.add("SE1"); + validZones.add("SE2"); + validZones.add("SE3"); + validZones.add("SE4"); + + //List prisLista = getPriser(zoneOf, dateToday); + + +//Loopar igenom args och letar efter input från terminalen, case stryr vad som händer om ex --zone skrivs in + //if ger nya värden till zoneOf, dateOf, chargeOf och isHelped och skickar tillbaka till main-metoden + for (int i = 0; i < args.length; i++) { + switch (args[i]) { + case "--zone" -> { + if (i + 1 < args.length) { + zoneOf = args[++i]; + }else { + ifInvalidChoice(); + return; + } + + } + case "--date" -> { + if (i + 1 < args.length) { + dateOf = args[++i]; + + } else { + ifInvalidChoice(); + return; + } + } + case "--charge" -> { + if (i + 1 < args.length) { + chargeOf = args[++i]; + if (chargeOf != null) { + //if charge anropas visa laddningsfönster + } else { + ifInvalidChoice(); + return; + } + } + } + case "--help" -> { + //om args inehåller --hel anropas metoden sendHelp(); och sedan sätts isHelped till true. + helpMe(); + isHelped = true; + } + } + if (isHelped) return; + if (args.length == 0) { + ifInvalidChoice(); + return; + } } - if(containsArg(args, "--date")) { - String date = getArgValue(args, "--date"); - LocalDate idag = LocalDate.now(); - System.out.println("Datum: " + idag); + LocalDate dagensDatum; + if (dateOf != null) + try { + dagensDatum = LocalDate.parse(dateOf); + } catch (DateTimeException e) { + System.out.println("Ogiltigt datum: " + dateOf); + ifInvalidChoice(); + return; + } + else { + dagensDatum = LocalDate.now(); } + ElpriserAPI.Prisklass zon; - + if (zoneOf == null || !validZones.contains(zoneOf)) { + System.out.println("Ogiltig zon: " + zoneOf); + ifInvalidChoice(); + return; } + zon = ElpriserAPI.Prisklass.valueOf(zoneOf); + } + - // metod för att gå igenom och letar efter valt argument i innehållet i args[] + + // metod för att gå igenom och letar efter valt argument i innehållet i args[] //key är en variabel för argumentet i kommandotolken - //behövs för om man har arument utan värde, Kollar om ett argument finns + //behövs för om man har argument utan värde, Kollar om ett argument finns /*args[]: alla argument från kommandoraden - key: det argument du letar efter, t.ex. "--zone"*/ @@ -55,13 +126,28 @@ public static String getArgValue(String[] args, String key) { return null; } + //Metod för att hämta elpriser + public static double getElpriser(List dagensPriser) { + double summa = 0.0; + for (ElpriserAPI.Elpris elpriser : dagensPriser) { + summa += elpriser.sekPerKWh(); + } + return summa; + } +//Metod som anropas om det inmatats ett felaktigt argument + private static void ifInvalidChoice() { + boolean isHelped; + System.out.println("Ogiltigt val, du skickas nu till hjälpmeny"); + helpMe(); + isHelped = true; + } // metod för --help att skickas till if-sats public static void helpMe() { System.out.println(""" Hjälpcenter ______________________ - Användning: + Usage / Användning: java -cp target/classes com.example.Main [alternativ] Alternativ: From dd7dae2343857d3c95ea561511a407a4776519ca Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 24 Sep 2025 16:49:29 +0200 Subject: [PATCH 05/22] hejhej nu funkar det, wihoo --- src/main/java/com/example/Main.java | 62 +++++++++++++++++++---------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index efc5c900..2846d66a 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -2,11 +2,10 @@ import com.example.api.ElpriserAPI; +import java.text.NumberFormat; import java.time.DateTimeException; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; public class Main { public static void main(String[] args) { @@ -18,6 +17,7 @@ public static void main(String[] args) { String dateOf = null; String chargeOf = null; boolean isHelped = false; + boolean isSorted = false; List validZones = new ArrayList<>(); validZones.add("SE1"); @@ -25,30 +25,33 @@ public static void main(String[] args) { validZones.add("SE3"); validZones.add("SE4"); - //List prisLista = getPriser(zoneOf, dateToday); - //Loopar igenom args och letar efter input från terminalen, case stryr vad som händer om ex --zone skrivs in //if ger nya värden till zoneOf, dateOf, chargeOf och isHelped och skickar tillbaka till main-metoden + if (args.length == 0) { + ifInvalidChoice(); + return; + } + for (int i = 0; i < args.length; i++) { switch (args[i]) { case "--zone" -> { if (i + 1 < args.length) { zoneOf = args[++i]; - }else { - ifInvalidChoice(); - return; - } + } else { + ifInvalidChoice(); + return; + } } case "--date" -> { if (i + 1 < args.length) { dateOf = args[++i]; - } else { - ifInvalidChoice(); - return; - } + } else { + ifInvalidChoice(); + return; + } } case "--charge" -> { if (i + 1 < args.length) { @@ -61,6 +64,8 @@ public static void main(String[] args) { } } } + case "--sorted" -> isSorted = true; + case "--help" -> { //om args inehåller --hel anropas metoden sendHelp(); och sedan sätts isHelped till true. helpMe(); @@ -68,10 +73,7 @@ public static void main(String[] args) { } } if (isHelped) return; - if (args.length == 0) { - ifInvalidChoice(); - return; - } + } LocalDate dagensDatum; if (dateOf != null) @@ -87,17 +89,37 @@ public static void main(String[] args) { } ElpriserAPI.Prisklass zon; - if (zoneOf == null || !validZones.contains(zoneOf)) { + if (zoneOf == null || !validZones.contains(zoneOf.toUpperCase())) { System.out.println("Ogiltig zon: " + zoneOf); ifInvalidChoice(); return; } - zon = ElpriserAPI.Prisklass.valueOf(zoneOf); + zon = ElpriserAPI.Prisklass.valueOf(zoneOf.toUpperCase()); + List prisLista = elpriserApi.getPriser(dagensDatum, zon); + NumberFormat numberFormat = NumberFormat.getNumberInstance(new Locale("sv", "SE")); + numberFormat.setMinimumFractionDigits(2); + numberFormat.setMaximumFractionDigits(2); - } + if (prisLista == null || prisLista.isEmpty()) { + System.out.println("Inga priser hittades för zon: " + zon + "den " + dagensDatum); + return; + } + if (isSorted) { + prisLista.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh)); //Ta varje Elpris-objekt och anropa sekPerKwh + } + + for (ElpriserAPI.Elpris elpriser : prisLista) { + + String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); + System.out.println("Tid: " + elpriser.timeStart().toLocalTime() + " Pris: " + formateratPris + "öre"); + } + + + } + //plusDays(1) - metod för att visa för nästa dag // metod för att gå igenom och letar efter valt argument i innehållet i args[] From 9ed3a12e2168f9841c67efcbc37f01045f440265 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 24 Sep 2025 17:00:05 +0200 Subject: [PATCH 06/22] fixade formatering :)))) --- src/main/java/com/example/Main.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 2846d66a..fe92c05a 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -107,13 +107,13 @@ public static void main(String[] args) { } if (isSorted) { - prisLista.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh)); //Ta varje Elpris-objekt och anropa sekPerKwh + prisLista.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh)); //Ta varje Elpris-objekt och anropa sekPerKwh | reversed blir fallande } for (ElpriserAPI.Elpris elpriser : prisLista) { String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); - System.out.println("Tid: " + elpriser.timeStart().toLocalTime() + " Pris: " + formateratPris + "öre"); + System.out.println("Tid: " + elpriser.timeStart().toLocalTime() + " Pris: " + formateratPris + " öre/KWh"); } From 17f97149b9b212baec4b8376c58366d0663a5153 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Thu, 25 Sep 2025 14:44:20 +0200 Subject: [PATCH 07/22] lagt till: medelpris --- src/main/java/com/example/Main.java | 97 +++++++++++-------------- src/test/java/com/example/MainTest.java | 14 ++-- 2 files changed, 50 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index fe92c05a..98685262 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -35,17 +35,14 @@ public static void main(String[] args) { for (int i = 0; i < args.length; i++) { switch (args[i]) { - case "--zone" -> { - if (i + 1 < args.length) { + case "--zone" -> { if (i + 1 < args.length) { zoneOf = args[++i]; } else { ifInvalidChoice(); return; } - } - case "--date" -> { - if (i + 1 < args.length) { + case "--date" -> { if (i + 1 < args.length) { dateOf = args[++i]; } else { @@ -53,8 +50,7 @@ public static void main(String[] args) { return; } } - case "--charge" -> { - if (i + 1 < args.length) { + case "--charge" -> { if (i + 1 < args.length) { chargeOf = args[++i]; if (chargeOf != null) { //if charge anropas visa laddningsfönster @@ -67,7 +63,7 @@ public static void main(String[] args) { case "--sorted" -> isSorted = true; case "--help" -> { - //om args inehåller --hel anropas metoden sendHelp(); och sedan sätts isHelped till true. + //om args inehåller --help anropas metoden sendHelp(); och sedan sätts isHelped till true. helpMe(); isHelped = true; } @@ -76,6 +72,7 @@ public static void main(String[] args) { } LocalDate dagensDatum; + if (dateOf != null) try { dagensDatum = LocalDate.parse(dateOf); @@ -105,20 +102,55 @@ public static void main(String[] args) { System.out.println("Inga priser hittades för zon: " + zon + "den " + dagensDatum); return; } - if (isSorted) { - prisLista.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh)); //Ta varje Elpris-objekt och anropa sekPerKwh | reversed blir fallande + prisLista.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); //Ta varje Elpris-objekt och anropa sekPerKwh | reversed blir fallande } + //LocalDate tomorrow = dagensDatum.plusDays(1); for (ElpriserAPI.Elpris elpriser : prisLista) { String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); - System.out.println("Tid: " + elpriser.timeStart().toLocalTime() + " Pris: " + formateratPris + " öre/KWh"); + System.out.println("Tid: " + elpriser.timeStart().toLocalTime() +"-"+ elpriser.timeEnd().toLocalTime() + " Pris: " + formateratPris + " öre/KWh"); + } + /*if (tomorrow != null) { + System.out.println("Morgon dagens elpriser: " + tomorrow); + }*/ + + double summa = getElpriser(prisLista); + double medelPrisOfDay = summa/ prisLista.size(); + System.out.println("Medelpriset för dagens elpriser är: " + numberFormat.format(medelPrisOfDay*100) + " öre/KWh"); +//SLiding window int min = int index = double sum = + } + //Metod som anropas om det inmatats ett felaktigt argument + private static void ifInvalidChoice() { + boolean isHelped; + System.out.println("Ogiltigt val, du skickas nu till hjälpmeny"); + helpMe(); + isHelped = true; } + // metod för --help att skickas till if-sats + public static void helpMe() { + System.out.println(""" + Hjälpcenter + ______________________ + + Usage / Användning: + java -cp target/classes com.example.Main [alternativ] + Alternativ: + --zone SE1|SE2|SE3|SE4 (obligatoriskt) Välj elpris-zon + --date YYYY-MM-DD (valfritt) Välj datum, t.ex. 2025-09-21 + --charging 2h|4h|8h (valfritt) Hitta billigaste laddningsfönster + --sorted (valfritt) Sortera priser fallande + --help (valfritt) Visa denna hjälptext + + Exempel: + java Main --zone SE3 --charging 4h + """); + } //plusDays(1) - metod för att visa för nästa dag @@ -130,23 +162,6 @@ public static void main(String[] args) { - key: det argument du letar efter, t.ex. "--zone"*/ - public static boolean containsArg(String[] args, String key) { - for(String arg : args) { - if (arg.equalsIgnoreCase(key)) { - return true; - } - } - return false; - } - - public static String getArgValue(String[] args, String key) { - for (int i = 0; i < args.length -1 ; i++) { - if (args[i].equalsIgnoreCase(key)) { - return args[i+1]; - } - } - return null; - } //Metod för att hämta elpriser public static double getElpriser(List dagensPriser) { @@ -156,33 +171,7 @@ public static double getElpriser(List dagensPriser) { } return summa; } -//Metod som anropas om det inmatats ett felaktigt argument - private static void ifInvalidChoice() { - boolean isHelped; - System.out.println("Ogiltigt val, du skickas nu till hjälpmeny"); - helpMe(); - isHelped = true; - } -// metod för --help att skickas till if-sats -public static void helpMe() { - System.out.println(""" - Hjälpcenter - ______________________ - Usage / Användning: - java -cp target/classes com.example.Main [alternativ] - - Alternativ: - --zone SE1|SE2|SE3|SE4 (obligatoriskt) Välj elpris-zon - --date YYYY-MM-DD (valfritt) Välj datum, t.ex. 2025-09-21 - --charging 2h|4h|8h (valfritt) Hitta billigaste laddningsfönster - --sorted (valfritt) Sortera priser fallande - --help (valfritt) Visa denna hjälptext - - Exempel: - java Main --zone SE3 --charging 4h - """); -} } diff --git a/src/test/java/com/example/MainTest.java b/src/test/java/com/example/MainTest.java index c61f3589..0232018d 100644 --- a/src/test/java/com/example/MainTest.java +++ b/src/test/java/com/example/MainTest.java @@ -170,13 +170,13 @@ void displaySortedPrices_whenRequested() { // Expected sorted output (ascending by price) List expectedOrder = List.of( - "20-21 30,00 öre", - "22-23 20,00 öre", - "01-02 15,00 öre", - "02-03 15,00 öre", - "21-22 10,00 öre", - "23-00 10,00 öre", - "00-01 10,00 öre" + "Tid: 20:00-21:00 Pris: 30,00 öre/KWh", + "Tid: 22:00-23:00 Pris: 20,00 öre/KWh", + "Tid: 01:00-02:00 Pris: 15,00 öre/KWh", + "Tid: 02:00-03:00 Pris: 15,00 öre/KWh", + "Tid: 21:00-22:00 Pris: 10,00 öre/KWh", + "Tid: 23:00-00:00 Pris: 10,00 öre/KWh", + "Tid: 00:00-01:00 Pris: 10,00 öre/KWh" ); // Extract actual lines that match the pattern From 5d8144ceae91ccd80944fbf726c77d069df4795b Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Thu, 25 Sep 2025 14:55:45 +0200 Subject: [PATCH 08/22] lagt till: medelpris --- src/main/java/com/example/Main.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 98685262..bf39bd2b 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -118,7 +118,10 @@ public static void main(String[] args) { }*/ - double summa = getElpriser(prisLista); + double summa = 0.0; + for (ElpriserAPI.Elpris elpriser : prisLista) { + summa += elpriser.sekPerKWh(); + } double medelPrisOfDay = summa/ prisLista.size(); System.out.println("Medelpriset för dagens elpriser är: " + numberFormat.format(medelPrisOfDay*100) + " öre/KWh"); @@ -154,23 +157,11 @@ public static void helpMe() { //plusDays(1) - metod för att visa för nästa dag - // metod för att gå igenom och letar efter valt argument i innehållet i args[] - //key är en variabel för argumentet i kommandotolken - //behövs för om man har argument utan värde, Kollar om ett argument finns - /*args[]: alla argument från kommandoraden -- key: det argument du letar efter, t.ex. "--zone"*/ + //Metod för att göra att hämta elpriser? - //Metod för att hämta elpriser - public static double getElpriser(List dagensPriser) { - double summa = 0.0; - for (ElpriserAPI.Elpris elpriser : dagensPriser) { - summa += elpriser.sekPerKWh(); - } - return summa; - } } From 0cefe4cb00ef1c0d73561a0925147180b33e6188 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Thu, 25 Sep 2025 14:59:26 +0200 Subject: [PATCH 09/22] =?UTF-8?q?f=C3=B6rsta=20push,=20=C3=A4ven=20gjort?= =?UTF-8?q?=20=C3=A4ndringar=20i=20MainTest.java=20f=C3=B6r=20till=C3=A5te?= =?UTF-8?q?lse=20av=20=20snyggare=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index bf39bd2b..d4038c5d 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -84,6 +84,7 @@ public static void main(String[] args) { else { dagensDatum = LocalDate.now(); } + ElpriserAPI.Prisklass zon; if (zoneOf == null || !validZones.contains(zoneOf.toUpperCase())) { @@ -129,10 +130,9 @@ public static void main(String[] args) { } //Metod som anropas om det inmatats ett felaktigt argument private static void ifInvalidChoice() { - boolean isHelped; System.out.println("Ogiltigt val, du skickas nu till hjälpmeny"); helpMe(); - isHelped = true; + } // metod för --help att skickas till if-sats public static void helpMe() { From 54f622072b199227164a8ed5fdd9b32598de2557 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Fri, 26 Sep 2025 17:46:06 +0200 Subject: [PATCH 10/22] =?UTF-8?q?P=C3=A5b=C3=B6rjat=20metoder=20och=20orga?= =?UTF-8?q?nisera=20upp=20kod.=20=C3=84ven=20=C3=A4ndrar=20tillbaka=20form?= =?UTF-8?q?atteringen=20i=20MainTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 100 +++++++++++++++++------- src/test/java/com/example/MainTest.java | 14 ++-- 2 files changed, 80 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index d4038c5d..352ba592 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -5,14 +5,23 @@ import java.text.NumberFormat; import java.time.DateTimeException; import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.*; + +//Att göra idag +//todo: Skapa en metod för att snygga till min switch +//todo: skapa en metod som beräknar min,max & medelpris +//todo: hämta morgondagens priser och skriv ut dem +//todo: skapa en metod för sliding window till -charging 2h,4h,8h + + public class Main { public static void main(String[] args) { - System.out.println("Välkommen till Elpris-kollen!"); ElpriserAPI elpriserApi = new ElpriserAPI(); - + System.out.println("Välkommen till Elpris-kollen!"); String zoneOf = null; String dateOf = null; String chargeOf = null; @@ -28,25 +37,21 @@ public static void main(String[] args) { //Loopar igenom args och letar efter input från terminalen, case stryr vad som händer om ex --zone skrivs in //if ger nya värden till zoneOf, dateOf, chargeOf och isHelped och skickar tillbaka till main-metoden - if (args.length == 0) { - ifInvalidChoice(); - return; + if (args.length == 0) {ifInvalidChoice(); } for (int i = 0; i < args.length; i++) { switch (args[i]) { case "--zone" -> { if (i + 1 < args.length) { zoneOf = args[++i]; - } else { - ifInvalidChoice(); + } else { ifInvalidChoice(); return; } } case "--date" -> { if (i + 1 < args.length) { dateOf = args[++i]; - } else { - ifInvalidChoice(); + } else { ifInvalidChoice(); return; } } @@ -54,18 +59,14 @@ public static void main(String[] args) { chargeOf = args[++i]; if (chargeOf != null) { //if charge anropas visa laddningsfönster - } else { - ifInvalidChoice(); + } else { ifInvalidChoice(); return; } } } case "--sorted" -> isSorted = true; - case "--help" -> { - //om args inehåller --help anropas metoden sendHelp(); och sedan sätts isHelped till true. - helpMe(); - isHelped = true; + case "--help" -> { helpMe(); isHelped = true; } } if (isHelped) return; @@ -73,6 +74,7 @@ public static void main(String[] args) { } LocalDate dagensDatum; + if (dateOf != null) try { dagensDatum = LocalDate.parse(dateOf); @@ -84,7 +86,7 @@ public static void main(String[] args) { else { dagensDatum = LocalDate.now(); } - + LocalDate tomorrow = dagensDatum.plusDays(1); ElpriserAPI.Prisklass zon; if (zoneOf == null || !validZones.contains(zoneOf.toUpperCase())) { @@ -94,40 +96,84 @@ public static void main(String[] args) { } zon = ElpriserAPI.Prisklass.valueOf(zoneOf.toUpperCase()); - List prisLista = elpriserApi.getPriser(dagensDatum, zon); + List priserIdag = elpriserApi.getPriser(dagensDatum, zon); + List priserImorgon = elpriserApi.getPriser(tomorrow, zon); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH"); NumberFormat numberFormat = NumberFormat.getNumberInstance(new Locale("sv", "SE")); numberFormat.setMinimumFractionDigits(2); numberFormat.setMaximumFractionDigits(2); - if (prisLista == null || prisLista.isEmpty()) { + if (priserIdag == null || priserIdag.isEmpty()) { //Kolla om jag kan jämföra morgondagens i denna också System.out.println("Inga priser hittades för zon: " + zon + "den " + dagensDatum); return; } if (isSorted) { - prisLista.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); //Ta varje Elpris-objekt och anropa sekPerKwh | reversed blir fallande + priserIdag.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); + priserImorgon.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); + //Ta varje Elpris-objekt och anropa sekPerKwh | reversed blir fallande } - //LocalDate tomorrow = dagensDatum.plusDays(1); - for (ElpriserAPI.Elpris elpriser : prisLista) { + for (ElpriserAPI.Elpris elpriser : priserIdag) { //gör till metod String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); - System.out.println("Tid: " + elpriser.timeStart().toLocalTime() +"-"+ elpriser.timeEnd().toLocalTime() + " Pris: " + formateratPris + " öre/KWh"); + System.out.println("Tid: " + elpriser.timeStart().format(timeFormatter) +"-"+ elpriser.timeEnd().format(timeFormatter) + " Pris: " + formateratPris + " öre/KWh"); + } + for (ElpriserAPI.Elpris elpriser : priserImorgon) { //gör till metod, sätta start tid och slut tid till variabler? + if (priserImorgon.isEmpty()) { + System.out.println("Ingen prisdata är tillgänglig för morgondagen"); + } + else { String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); + System.out.println("Tid: " + elpriser.timeStart().format(timeFormatter) + "-" + elpriser.timeEnd().format(timeFormatter) + " Pris: " + formateratPris + " öre/KWh"); + } } - /*if (tomorrow != null) { - System.out.println("Morgon dagens elpriser: " + tomorrow); - }*/ + medelPris(priserIdag, numberFormat); + priceMinMax(priserIdag, numberFormat, timeFormatter); + +//SLiding window int min = int index = double sum = + } + private static void medelPris(List prisLista, NumberFormat numberFormat) { double summa = 0.0; for (ElpriserAPI.Elpris elpriser : prisLista) { summa += elpriser.sekPerKWh(); } double medelPrisOfDay = summa/ prisLista.size(); - System.out.println("Medelpriset för dagens elpriser är: " + numberFormat.format(medelPrisOfDay*100) + " öre/KWh"); + System.out.println("Medelpriser för dagen är: " + numberFormat.format(medelPrisOfDay*100) + " öre/KWh"); + } + + public static void priceMinMax (List priser, NumberFormat numberFormat, DateTimeFormatter timeFormatter) { + double minPris = Double.MAX_VALUE; + double maxPris = Double.MIN_VALUE; + String minTid = null; + String minTidSlut = null; + String maxTid = null; + String maxTidSlut = null; + if (priser.isEmpty()) { + System.out.println("Ingen prisdata finns att visa"); + } + + for (ElpriserAPI.Elpris elpriser : priser) { + double worthOf = elpriser.sekPerKWh(); + + if (minPris > worthOf ) { + minPris = worthOf; + minTid = elpriser.timeStart().format(timeFormatter); + minTidSlut = elpriser.timeEnd().format(timeFormatter); + } + if (maxPris < worthOf) { + maxPris = worthOf; + maxTid = elpriser.timeStart().format(timeFormatter); + maxTidSlut = elpriser.timeEnd().format(timeFormatter); + } + } + System.out.printf("Lägsta pris för dagen: %s öre/KWh Kl: %s - %s \n", numberFormat.format(minPris*100), minTid, minTidSlut); + System.out.printf("Högsta pris för dagen: %s öre/KWh Kl: %s - %s \n", numberFormat.format(maxPris*100), maxTid, maxTidSlut); -//SLiding window int min = int index = double sum = } + + //Metod som anropas om det inmatats ett felaktigt argument private static void ifInvalidChoice() { System.out.println("Ogiltigt val, du skickas nu till hjälpmeny"); diff --git a/src/test/java/com/example/MainTest.java b/src/test/java/com/example/MainTest.java index 0232018d..a2795105 100644 --- a/src/test/java/com/example/MainTest.java +++ b/src/test/java/com/example/MainTest.java @@ -170,13 +170,13 @@ void displaySortedPrices_whenRequested() { // Expected sorted output (ascending by price) List expectedOrder = List.of( - "Tid: 20:00-21:00 Pris: 30,00 öre/KWh", - "Tid: 22:00-23:00 Pris: 20,00 öre/KWh", - "Tid: 01:00-02:00 Pris: 15,00 öre/KWh", - "Tid: 02:00-03:00 Pris: 15,00 öre/KWh", - "Tid: 21:00-22:00 Pris: 10,00 öre/KWh", - "Tid: 23:00-00:00 Pris: 10,00 öre/KWh", - "Tid: 00:00-01:00 Pris: 10,00 öre/KWh" + "Tid: 20-21 Pris: 30,00 öre/KWh", + "Tid: 22-23 Pris: 20,00 öre/KWh", + "Tid: 01-02 Pris: 15,00 öre/KWh", + "Tid: 02-03 Pris: 15,00 öre/KWh", + "Tid: 21-22 Pris: 10,00 öre/KWh", + "Tid: 23-00 Pris: 10,00 öre/KWh", + "Tid: 00-01 Pris: 10,00 öre/KWh" ); // Extract actual lines that match the pattern From c367107a358d70b481c80124d77c148be81d0a2e Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Sat, 27 Sep 2025 18:56:58 +0200 Subject: [PATCH 11/22] =?UTF-8?q?Metod=20f=C3=B6r=20att=20skriva=20ut=20pr?= =?UTF-8?q?iser=20klar,=20p=C3=A5b=C3=B6rjat=20charging=20metod.=20St?= =?UTF-8?q?=C3=B6tt=20problem=20med=20ett=20av=20testerna:=20koden=20funge?= =?UTF-8?q?rar=20i=20terminalen.=20Men=20test=201=20s=C3=A4ger=20att=20jag?= =?UTF-8?q?=20inte=20skriver=20ut=20n=C3=A5got...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 56 ++++++++++++++--------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 352ba592..a4754530 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -103,35 +103,40 @@ public static void main(String[] args) { numberFormat.setMinimumFractionDigits(2); numberFormat.setMaximumFractionDigits(2); - if (priserIdag == null || priserIdag.isEmpty()) { //Kolla om jag kan jämföra morgondagens i denna också - System.out.println("Inga priser hittades för zon: " + zon + "den " + dagensDatum); + + skrivUtPriser(priserIdag,timeFormatter, numberFormat, "Dagenspriser: ", isSorted); + skrivUtPriser(priserImorgon,timeFormatter, numberFormat, "Morgondagens priser: ", isSorted); + medelPris(priserIdag, numberFormat); + priceMinMax(priserIdag, numberFormat, timeFormatter); + + +//SLiding window int min = int index = double sum = + } + + public static void chargingWindow (List elpriserLadda, int timmar, DateTimeFormatter timeFormatter, NumberFormat numberFormat) { + //todo: 2,4,8 h, testa i sub-arrays(Sliding windows) + int min; + int max; + int index; + } + + public static void skrivUtPriser (List elprisList, DateTimeFormatter timeFormatter, NumberFormat numberFormat,String dag, boolean isSorted) { + + + if (elprisList == null || elprisList.isEmpty()) { + System.out.println("Ingen data för " + dag + " är tillgänglig"); return; } if (isSorted) { - priserIdag.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); - priserImorgon.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); - //Ta varje Elpris-objekt och anropa sekPerKwh | reversed blir fallande - } - - for (ElpriserAPI.Elpris elpriser : priserIdag) { //gör till metod + elprisList.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); + } + System.out.println(dag); + for (ElpriserAPI.Elpris elpriser : elprisList) { String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); System.out.println("Tid: " + elpriser.timeStart().format(timeFormatter) +"-"+ elpriser.timeEnd().format(timeFormatter) + " Pris: " + formateratPris + " öre/KWh"); } - for (ElpriserAPI.Elpris elpriser : priserImorgon) { //gör till metod, sätta start tid och slut tid till variabler? - if (priserImorgon.isEmpty()) { - System.out.println("Ingen prisdata är tillgänglig för morgondagen"); - } - else { String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); - System.out.println("Tid: " + elpriser.timeStart().format(timeFormatter) + "-" + elpriser.timeEnd().format(timeFormatter) + " Pris: " + formateratPris + " öre/KWh"); - } - } - medelPris(priserIdag, numberFormat); - priceMinMax(priserIdag, numberFormat, timeFormatter); - - -//SLiding window int min = int index = double sum = } private static void medelPris(List prisLista, NumberFormat numberFormat) { @@ -152,6 +157,7 @@ public static void priceMinMax (List priser, NumberFormat nu String maxTidSlut = null; if (priser.isEmpty()) { System.out.println("Ingen prisdata finns att visa"); + return; } for (ElpriserAPI.Elpris elpriser : priser) { @@ -202,14 +208,6 @@ public static void helpMe() { } //plusDays(1) - metod för att visa för nästa dag - - - - //Metod för att göra att hämta elpriser? - - - - } From e9fb009d243689d8053b8b53fe2a8f9ec2aac152 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Sun, 28 Sep 2025 15:15:15 +0200 Subject: [PATCH 12/22] Charging window, med sliding window algoritm --- src/main/java/com/example/Main.java | 82 ++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index a4754530..8d39f0d7 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -5,7 +5,6 @@ import java.text.NumberFormat; import java.time.DateTimeException; import java.time.LocalDate; -import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -24,7 +23,7 @@ public static void main(String[] args) { System.out.println("Välkommen till Elpris-kollen!"); String zoneOf = null; String dateOf = null; - String chargeOf = null; + String isCharging = null; boolean isHelped = false; boolean isSorted = false; @@ -51,19 +50,15 @@ public static void main(String[] args) { case "--date" -> { if (i + 1 < args.length) { dateOf = args[++i]; - } else { ifInvalidChoice(); - return; + } else { ifInvalidChoice(); return; } } case "--charge" -> { if (i + 1 < args.length) { - chargeOf = args[++i]; - if (chargeOf != null) { - //if charge anropas visa laddningsfönster - } else { ifInvalidChoice(); - return; + isCharging = args[++i]; + } else { ifInvalidChoice(); return; } } - } + case "--sorted" -> isSorted = true; case "--help" -> { helpMe(); isHelped = true; @@ -89,13 +84,15 @@ public static void main(String[] args) { LocalDate tomorrow = dagensDatum.plusDays(1); ElpriserAPI.Prisklass zon; + + + if (zoneOf == null || !validZones.contains(zoneOf.toUpperCase())) { System.out.println("Ogiltig zon: " + zoneOf); ifInvalidChoice(); return; } zon = ElpriserAPI.Prisklass.valueOf(zoneOf.toUpperCase()); - List priserIdag = elpriserApi.getPriser(dagensDatum, zon); List priserImorgon = elpriserApi.getPriser(tomorrow, zon); DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH"); @@ -104,23 +101,60 @@ public static void main(String[] args) { numberFormat.setMaximumFractionDigits(2); - skrivUtPriser(priserIdag,timeFormatter, numberFormat, "Dagenspriser: ", isSorted); + if (isCharging != null) { + try { + int timmar = Integer.parseInt(isCharging.replace("h", "")); //när användaren skriver 4h + chargingWindow(priserIdag, timmar, timeFormatter, numberFormat); + } catch (NumberFormatException e) { + ifInvalidChoice(); return; + } + } + + + + skrivUtPriser(priserIdag,timeFormatter, numberFormat, "Dagens priser: ", isSorted); skrivUtPriser(priserImorgon,timeFormatter, numberFormat, "Morgondagens priser: ", isSorted); medelPris(priserIdag, numberFormat); priceMinMax(priserIdag, numberFormat, timeFormatter); + //SLiding window int min = int index = double sum = } public static void chargingWindow (List elpriserLadda, int timmar, DateTimeFormatter timeFormatter, NumberFormat numberFormat) { //todo: 2,4,8 h, testa i sub-arrays(Sliding windows) - int min; - int max; - int index; + + if (elpriserLadda == null || timmar < elpriserLadda.size()) { + System.out.println("Inga eller för få timmar för att beräkna laddningsfönster."); + } + + double minSumma = Double.MAX_VALUE; + int startIndex = -1; + + for (int i = 0; i <= elpriserLadda.size() - 1; i++) { + double summa = 0.0; + for (int j = 0; j < timmar; j++) { + summa += elpriserLadda.get(i+j).sekPerKWh(); + } + if (summa < minSumma) { + minSumma = summa; + startIndex = i; + } + } + if (startIndex != -1) { + ElpriserAPI.Elpris start = elpriserLadda.get(startIndex); + ElpriserAPI.Elpris slut = elpriserLadda.get(startIndex + timmar -1); + + String startTid = start.timeStart().format(timeFormatter); + String slutTid = slut.timeStart().format(timeFormatter); + String formateratPris = numberFormat.format(minSumma *100); + + System.out.printf("Billigaste laddningsfönster för %dh är %s-%s, snittpris %s öre/KWh", timmar, startTid, slutTid, formateratPris); + } } - public static void skrivUtPriser (List elprisList, DateTimeFormatter timeFormatter, NumberFormat numberFormat,String dag, boolean isSorted) { + public static void skrivUtPriser(List elprisList, DateTimeFormatter timeFormatter, NumberFormat numberFormat, String dag, boolean isSorted) { if (elprisList == null || elprisList.isEmpty()) { @@ -133,11 +167,22 @@ public static void skrivUtPriser (List elprisList, DateTimeF } System.out.println(dag); for (ElpriserAPI.Elpris elpriser : elprisList) { + if (!isValidElpris(elpriser)) { + System.out.println("Ogiltigt elpris - hoppar över.."); + continue; + } String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); System.out.println("Tid: " + elpriser.timeStart().format(timeFormatter) +"-"+ elpriser.timeEnd().format(timeFormatter) + " Pris: " + formateratPris + " öre/KWh"); } } + public static boolean isValidElpris(ElpriserAPI.Elpris elpris) { + return elpris != null && + elpris.sekPerKWh() > 0 && + elpris.timeStart() != null && + elpris.timeEnd() != null; + } + private static void medelPris(List prisLista, NumberFormat numberFormat) { double summa = 0.0; @@ -145,7 +190,7 @@ private static void medelPris(List prisLista, NumberFormat n summa += elpriser.sekPerKWh(); } double medelPrisOfDay = summa/ prisLista.size(); - System.out.println("Medelpriser för dagen är: " + numberFormat.format(medelPrisOfDay*100) + " öre/KWh"); + System.out.printf("Medelpriser för dagen är: %s öre/KWh \n", numberFormat.format(medelPrisOfDay*100)); } public static void priceMinMax (List priser, NumberFormat numberFormat, DateTimeFormatter timeFormatter) { @@ -206,12 +251,11 @@ public static void helpMe() { java Main --zone SE3 --charging 4h """); } - //plusDays(1) - metod för att visa för nästa dag } - +// java -cp target/classes com.example.Main --zone SE2 --date 2025-09-04 --sorted From 2ef98d58601ae0f01e8085fe3adab688b968e657 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Mon, 29 Sep 2025 20:49:57 +0200 Subject: [PATCH 13/22] =?UTF-8?q?=C3=84ndrat=20tillbaka=20i=20maintest,=20?= =?UTF-8?q?printPrices-metod.=20skapat=20statiska=20f=C3=A4lt=20f=C3=B6r?= =?UTF-8?q?=20formatering,=20skapat=20en=20null-check=20i=20main=20f=C3=B6?= =?UTF-8?q?r=20att=20kolla=20om=20null=20innan=20all=20kod=20k=C3=B6rs.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 155 +++++++++++++++--------- src/test/java/com/example/MainTest.java | 14 +-- 2 files changed, 106 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 8d39f0d7..e6fdf240 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -15,11 +15,16 @@ //todo: hämta morgondagens priser och skriv ut dem //todo: skapa en metod för sliding window till -charging 2h,4h,8h +//todo: datumformatering + public class Main { + static DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH"); + static NumberFormat numberFormat = NumberFormat.getNumberInstance(); public static void main(String[] args) { ElpriserAPI elpriserApi = new ElpriserAPI(); + Locale.setDefault(Locale.of("sv", "SE")); System.out.println("Välkommen till Elpris-kollen!"); String zoneOf = null; String dateOf = null; @@ -34,32 +39,34 @@ public static void main(String[] args) { validZones.add("SE4"); -//Loopar igenom args och letar efter input från terminalen, case stryr vad som händer om ex --zone skrivs in + //Loopar igenom args och letar efter input från terminalen, case styr vad som händer om ex --zone skrivs in //if ger nya värden till zoneOf, dateOf, chargeOf och isHelped och skickar tillbaka till main-metoden - if (args.length == 0) {ifInvalidChoice(); + if (args.length == 0) { helpMe(); } for (int i = 0; i < args.length; i++) { switch (args[i]) { case "--zone" -> { if (i + 1 < args.length) { zoneOf = args[++i]; - } else { ifInvalidChoice(); - return; + } else { helpMe(); return; + } } case "--date" -> { if (i + 1 < args.length) { dateOf = args[++i]; - } else { ifInvalidChoice(); return; + } else { helpMe(); return; } } case "--charge" -> { if (i + 1 < args.length) { isCharging = args[++i]; - } else { ifInvalidChoice(); return; + } else { helpMe(); return; } } - case "--sorted" -> isSorted = true; + case "--sorted" -> { + isSorted = true; + } case "--help" -> { helpMe(); isHelped = true; } @@ -75,7 +82,7 @@ public static void main(String[] args) { dagensDatum = LocalDate.parse(dateOf); } catch (DateTimeException e) { System.out.println("Ogiltigt datum: " + dateOf); - ifInvalidChoice(); + helpMe(); return; } else { @@ -85,46 +92,53 @@ public static void main(String[] args) { ElpriserAPI.Prisklass zon; - - if (zoneOf == null || !validZones.contains(zoneOf.toUpperCase())) { System.out.println("Ogiltig zon: " + zoneOf); - ifInvalidChoice(); + helpMe(); return; } zon = ElpriserAPI.Prisklass.valueOf(zoneOf.toUpperCase()); List priserIdag = elpriserApi.getPriser(dagensDatum, zon); + if(priserIdag == null) { + System.out.println("Kunde inte hitta några priser"); + return; + } List priserImorgon = elpriserApi.getPriser(tomorrow, zon); - DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH"); - NumberFormat numberFormat = NumberFormat.getNumberInstance(new Locale("sv", "SE")); - numberFormat.setMinimumFractionDigits(2); + if(priserImorgon == null){ + System.out.println("Kunde inte hitta några priser för imorgon"); + return; + } + numberFormat.setMaximumFractionDigits(2); + numberFormat.setMinimumFractionDigits(2); + if (isSorted) { + List sorteradePriser = isSortedCombined(priserIdag, priserImorgon); + printPriser(sorteradePriser); + return; + } if (isCharging != null) { try { int timmar = Integer.parseInt(isCharging.replace("h", "")); //när användaren skriver 4h - chargingWindow(priserIdag, timmar, timeFormatter, numberFormat); + //chargingWindow(priserIdag, timmar....); } catch (NumberFormatException e) { - ifInvalidChoice(); return; + helpMe(); return; } } + skrivUtPriser(priserIdag, priserImorgon); + priceMinMax(priserIdag); + medelPris(priserIdag); - skrivUtPriser(priserIdag,timeFormatter, numberFormat, "Dagens priser: ", isSorted); - skrivUtPriser(priserImorgon,timeFormatter, numberFormat, "Morgondagens priser: ", isSorted); - medelPris(priserIdag, numberFormat); - priceMinMax(priserIdag, numberFormat, timeFormatter); - //SLiding window int min = int index = double sum = } - public static void chargingWindow (List elpriserLadda, int timmar, DateTimeFormatter timeFormatter, NumberFormat numberFormat) { + public static void chargingWindow (List elpriserLadda, int timmar) { //todo: 2,4,8 h, testa i sub-arrays(Sliding windows) - if (elpriserLadda == null || timmar < elpriserLadda.size()) { System.out.println("Inga eller för få timmar för att beräkna laddningsfönster."); } @@ -153,39 +167,74 @@ public static void chargingWindow (List elpriserLadda, int t System.out.printf("Billigaste laddningsfönster för %dh är %s-%s, snittpris %s öre/KWh", timmar, startTid, slutTid, formateratPris); } } + static void printPriser (List priser) { + priser.stream().forEach(elpriser -> System.out.printf(""" + %s-%s %.2f öre\n""",elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), elpriser.sekPerKWh()*100)); + } - public static void skrivUtPriser(List elprisList, DateTimeFormatter timeFormatter, NumberFormat numberFormat, String dag, boolean isSorted) { + public static List isSortedCombined (List priserIdag, List priserImorgon) { + List sammansattaPriser = new ArrayList<>(); + sammansattaPriser.addAll(priserIdag); + sammansattaPriser.addAll(priserImorgon); + sammansattaPriser.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed().thenComparing(ElpriserAPI.Elpris::timeStart)); - if (elprisList == null || elprisList.isEmpty()) { - System.out.println("Ingen data för " + dag + " är tillgänglig"); - return; + return sammansattaPriser; + } + + public static void skrivUtSorteradIdag(List elpriser) { + for (ElpriserAPI.Elpris elpris : elpriser){ + + String startTid = elpris.timeStart().format(timeFormatter); + String slutTid = elpris.timeEnd().format(timeFormatter); + String pris = numberFormat.format(elpris.sekPerKWh()*100); + + System.out.printf("%s-%s %s öre\n", startTid, slutTid, pris); + } - if (isSorted) { - elprisList.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed()); + } + public static void skrivUtSorteradImorgon(List elpriser) { + for (ElpriserAPI.Elpris elpris : elpriser){ + + String startTid = elpris.timeStart().format(timeFormatter); + String slutTid = elpris.timeEnd().format(timeFormatter); + String pris = numberFormat.format(elpris.sekPerKWh()*100); + + System.out.printf("%s-%s %s öre\n", startTid, slutTid, pris); } - System.out.println(dag); - for (ElpriserAPI.Elpris elpriser : elprisList) { - if (!isValidElpris(elpriser)) { - System.out.println("Ogiltigt elpris - hoppar över.."); - continue; + } + + public static void skrivUtPriser(List elprisIdag,List elprisImorgon) { + +//todo: Hämta elpriserna i en ArrayList för att skriva ut två dagars priser om morgondagens priser finns //List av listElpriserAPI + + List sammansattaPriser = new ArrayList<>(); + if (elprisIdag != null) { + sammansattaPriser.addAll(elprisIdag); + System.out.println("Dagens Priser:"); + for (ElpriserAPI.Elpris elpriser : elprisIdag) { + + String pris = numberFormat.format(elpriser.sekPerKWh()*100); + System.out.printf("%s-%s %s öre\n", elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), pris); } - String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100); - System.out.println("Tid: " + elpriser.timeStart().format(timeFormatter) +"-"+ elpriser.timeEnd().format(timeFormatter) + " Pris: " + formateratPris + " öre/KWh"); } + if (elprisImorgon != null) { + sammansattaPriser.addAll(elprisImorgon); + System.out.println("Morgondagens priser: "); + for (ElpriserAPI.Elpris elpriser : elprisImorgon) { + String pris = numberFormat.format(elpriser.sekPerKWh() * 100); + System.out.printf("%s-%s %s öre\n", elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), pris); + } + } } - public static boolean isValidElpris(ElpriserAPI.Elpris elpris) { - return elpris != null && - elpris.sekPerKWh() > 0 && - elpris.timeStart() != null && - elpris.timeEnd() != null; - } - - private static void medelPris(List prisLista, NumberFormat numberFormat) { + private static void medelPris(List prisLista) { double summa = 0.0; + if (prisLista == null) { + System.out.println("Ingen data tillgänglig för medelpris"); + } for (ElpriserAPI.Elpris elpriser : prisLista) { summa += elpriser.sekPerKWh(); } @@ -193,19 +242,20 @@ private static void medelPris(List prisLista, NumberFormat n System.out.printf("Medelpriser för dagen är: %s öre/KWh \n", numberFormat.format(medelPrisOfDay*100)); } - public static void priceMinMax (List priser, NumberFormat numberFormat, DateTimeFormatter timeFormatter) { + public static void priceMinMax (List prisLista) { + //todo: bryt ut max till en egen metod double minPris = Double.MAX_VALUE; double maxPris = Double.MIN_VALUE; String minTid = null; String minTidSlut = null; String maxTid = null; String maxTidSlut = null; - if (priser.isEmpty()) { - System.out.println("Ingen prisdata finns att visa"); + if (prisLista.isEmpty()) { + System.out.println("Ingen data finns att visa"); return; } - for (ElpriserAPI.Elpris elpriser : priser) { + for (ElpriserAPI.Elpris elpriser : prisLista) { double worthOf = elpriser.sekPerKWh(); if (minPris > worthOf ) { @@ -224,13 +274,6 @@ public static void priceMinMax (List priser, NumberFormat nu } - - //Metod som anropas om det inmatats ett felaktigt argument - private static void ifInvalidChoice() { - System.out.println("Ogiltigt val, du skickas nu till hjälpmeny"); - helpMe(); - - } // metod för --help att skickas till if-sats public static void helpMe() { System.out.println(""" @@ -248,7 +291,7 @@ public static void helpMe() { --help (valfritt) Visa denna hjälptext Exempel: - java Main --zone SE3 --charging 4h + java Main --zone SE3 -- date 2025-09-24 --charging 4h """); } diff --git a/src/test/java/com/example/MainTest.java b/src/test/java/com/example/MainTest.java index a2795105..c61f3589 100644 --- a/src/test/java/com/example/MainTest.java +++ b/src/test/java/com/example/MainTest.java @@ -170,13 +170,13 @@ void displaySortedPrices_whenRequested() { // Expected sorted output (ascending by price) List expectedOrder = List.of( - "Tid: 20-21 Pris: 30,00 öre/KWh", - "Tid: 22-23 Pris: 20,00 öre/KWh", - "Tid: 01-02 Pris: 15,00 öre/KWh", - "Tid: 02-03 Pris: 15,00 öre/KWh", - "Tid: 21-22 Pris: 10,00 öre/KWh", - "Tid: 23-00 Pris: 10,00 öre/KWh", - "Tid: 00-01 Pris: 10,00 öre/KWh" + "20-21 30,00 öre", + "22-23 20,00 öre", + "01-02 15,00 öre", + "02-03 15,00 öre", + "21-22 10,00 öre", + "23-00 10,00 öre", + "00-01 10,00 öre" ); // Extract actual lines that match the pattern From 4356a215af91ce3b2b8e96ea4717c93f8ac518bf Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Mon, 29 Sep 2025 20:54:02 +0200 Subject: [PATCH 14/22] =?UTF-8?q?f=C3=B6r=20push?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index e6fdf240..10985187 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -11,7 +11,7 @@ //Att göra idag //todo: Skapa en metod för att snygga till min switch -//todo: skapa en metod som beräknar min,max & medelpris + //todo: hämta morgondagens priser och skriv ut dem //todo: skapa en metod för sliding window till -charging 2h,4h,8h From e79238c1095848990c082df28300fb72fbffeafc Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Tue, 30 Sep 2025 16:57:32 +0200 Subject: [PATCH 15/22] =?UTF-8?q?Lagt=20till=20charging=20och=20formattera?= =?UTF-8?q?t=20utskrifter=20f=C3=B6r=20korrekt=20output=20enligt=20tester?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 68 +++++++++++++++++++---------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 10985187..aa92c669 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -11,8 +11,6 @@ //Att göra idag //todo: Skapa en metod för att snygga till min switch - -//todo: hämta morgondagens priser och skriv ut dem //todo: skapa en metod för sliding window till -charging 2h,4h,8h //todo: datumformatering @@ -28,7 +26,7 @@ public static void main(String[] args) { System.out.println("Välkommen till Elpris-kollen!"); String zoneOf = null; String dateOf = null; - String isCharging = null; + String chargingInput = null; boolean isHelped = false; boolean isSorted = false; @@ -58,8 +56,8 @@ public static void main(String[] args) { } else { helpMe(); return; } } - case "--charge" -> { if (i + 1 < args.length) { - isCharging = args[++i]; + case "--charging" -> { if (i + 1 < args.length) { + chargingInput = args[++i]; } else { helpMe(); return; } } @@ -68,10 +66,11 @@ public static void main(String[] args) { isSorted = true; } - case "--help" -> { helpMe(); isHelped = true; + case "--help" -> { + isHelped = true; + helpMe(); return; } } - if (isHelped) return; } LocalDate dagensDatum; @@ -112,59 +111,82 @@ public static void main(String[] args) { numberFormat.setMaximumFractionDigits(2); numberFormat.setMinimumFractionDigits(2); - if (isSorted) { - List sorteradePriser = isSortedCombined(priserIdag, priserImorgon); - printPriser(sorteradePriser); - return; - } + List kombineradeListor = combinedLists(priserIdag,priserImorgon); + - if (isCharging != null) { + int timmar =0; + if (chargingInput != null) { try { - int timmar = Integer.parseInt(isCharging.replace("h", "")); //när användaren skriver 4h - //chargingWindow(priserIdag, timmar....); + //när användaren skriver 4h h ersätts med "" + timmar = Integer.parseInt(chargingInput.replace("h", "")); + } catch (NumberFormatException e) { helpMe(); return; } + } + if (timmar > 0) { + chargingWindow(kombineradeListor, timmar); + return; + } + if (isSorted) { + List sorteradePriser = isSortedCombined(priserIdag, priserImorgon); + printPriser(sorteradePriser); + return; + } //else printhelp skrivUtPriser(priserIdag, priserImorgon); priceMinMax(priserIdag); medelPris(priserIdag); + } + + public static List combinedLists(List priserIdag, List priserImorgon) { + List kombineradeLaddpriser = new ArrayList<>(); + if (priserIdag != null) kombineradeLaddpriser.addAll(priserIdag); + if (priserImorgon != null) kombineradeLaddpriser.addAll(priserImorgon); -//SLiding window int min = int index = double sum = + return kombineradeLaddpriser; } public static void chargingWindow (List elpriserLadda, int timmar) { //todo: 2,4,8 h, testa i sub-arrays(Sliding windows) - if (elpriserLadda == null || timmar < elpriserLadda.size()) { + DateTimeFormatter minuteFormatter = DateTimeFormatter.ofPattern("HH:mm"); + NumberFormat newFormat = NumberFormat.getNumberInstance(Locale.of("sv", "SE")); + newFormat.setMaximumFractionDigits(2); + newFormat.setMinimumFractionDigits(1); + + if (elpriserLadda == null ||timmar<= 0|| elpriserLadda.isEmpty()|| timmar > elpriserLadda.size()) { System.out.println("Inga eller för få timmar för att beräkna laddningsfönster."); + return; } double minSumma = Double.MAX_VALUE; int startIndex = -1; - for (int i = 0; i <= elpriserLadda.size() - 1; i++) { + for (int i = 0; i <= elpriserLadda.size() - timmar; i++) { double summa = 0.0; for (int j = 0; j < timmar; j++) { summa += elpriserLadda.get(i+j).sekPerKWh(); } - if (summa < minSumma) { + if (summa< minSumma) { minSumma = summa; startIndex = i; } + } if (startIndex != -1) { ElpriserAPI.Elpris start = elpriserLadda.get(startIndex); ElpriserAPI.Elpris slut = elpriserLadda.get(startIndex + timmar -1); - String startTid = start.timeStart().format(timeFormatter); - String slutTid = slut.timeStart().format(timeFormatter); - String formateratPris = numberFormat.format(minSumma *100); + String startTid = start.timeStart().format(minuteFormatter); + String slutTid = slut.timeEnd().format(minuteFormatter); + double snittPris = (minSumma/timmar) * 100; + String formateratPris = newFormat.format(snittPris); - System.out.printf("Billigaste laddningsfönster för %dh är %s-%s, snittpris %s öre/KWh", timmar, startTid, slutTid, formateratPris); + System.out.printf("Billigaste laddningsfönster för %dh är kl %s-%s\nMedelpris för fönster: %s öre\n Påbörja laddning %s", timmar, startTid, slutTid, formateratPris, startTid); } } static void printPriser (List priser) { From 0461d539966b68a7f9cee9969ee5aa40f6d8c3f9 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 1 Oct 2025 08:57:15 +0200 Subject: [PATCH 16/22] =?UTF-8?q?tagit=20bort=20on=C3=B6dig=20metod=20(skr?= =?UTF-8?q?iv=20ut=20sorterad=20lista=20idag)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index aa92c669..505d0c35 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -123,7 +123,6 @@ public static void main(String[] args) { } catch (NumberFormatException e) { helpMe(); return; } - } if (timmar > 0) { @@ -203,19 +202,7 @@ public static List isSortedCombined (List elpriser) { - for (ElpriserAPI.Elpris elpris : elpriser){ - - String startTid = elpris.timeStart().format(timeFormatter); - String slutTid = elpris.timeEnd().format(timeFormatter); - String pris = numberFormat.format(elpris.sekPerKWh()*100); - - System.out.printf("%s-%s %s öre\n", startTid, slutTid, pris); - - } - } - public static void skrivUtSorteradImorgon(List elpriser) { + public static void skrivUtSorterad(List elpriser) { for (ElpriserAPI.Elpris elpris : elpriser){ String startTid = elpris.timeStart().format(timeFormatter); @@ -319,7 +306,6 @@ public static void helpMe() { } - // java -cp target/classes com.example.Main --zone SE2 --date 2025-09-04 --sorted From 4c6a6d2b1e22e57b3dcb4b899731d232c350bff6 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 1 Oct 2025 11:42:05 +0200 Subject: [PATCH 17/22] =?UTF-8?q?Sista=20testet=20avklarat,=20p=C3=A5b?= =?UTF-8?q?=C3=B6rjat=20att=20plocka=20bort=20och=20sortera=20om=20on?= =?UTF-8?q?=C3=B6diga=20rader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 45 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 505d0c35..588f134e 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -7,6 +7,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.stream.Collectors; //Att göra idag @@ -137,6 +138,7 @@ public static void main(String[] args) { skrivUtPriser(priserIdag, priserImorgon); priceMinMax(priserIdag); medelPris(priserIdag); + listWith96Prices(priserIdag); } @@ -188,6 +190,36 @@ public static void chargingWindow (List elpriserLadda, int t System.out.printf("Billigaste laddningsfönster för %dh är kl %s-%s\nMedelpris för fönster: %s öre\n Påbörja laddning %s", timmar, startTid, slutTid, formateratPris, startTid); } } + // Expected Min: Hour 0 -> avg(0.10, 0.11, 0.12, 0.13) = 0.115 SEK/kWh = 11,50 öre + // Expected Max: Hour 23 -> avg(2.40, 2.41, 2.42, 2.43) = 2.415 SEK/kWh = 241,50 öre + public static void listWith96Prices (List elpriser96) { + //behöver 24 grupper där varje grupp visar 4 priser som medelpris + //timme = 0, prisindex 1-4, (P1, P2, P3, P4) + + //i är 0; sålänge i är mindre än storleken på listan; öka i med 4 + for (int i = 0; i < elpriser96.size(); i += 4) { + //I varje loop, stoppa de fyra värderna i en sublist + List listaPerTimme = elpriser96.subList(i, i + 4); + + double sum = listaPerTimme.stream().mapToDouble(ElpriserAPI.Elpris::sekPerKWh).sum(); + double medelPris = sum/4.0; + + int timme = i/4; + int timme2 = timme +1; + + String timDel = String.format("%02d-%02d", timme, timme2); + //String priserIparantes = listaPerTimme.stream().map(elpris -> numberFormat.format(elpris.sekPerKWh()*100)).collect(Collectors.joining(",")); + double medelprisToOre = medelPris * 100; + String formateratMedelPris = numberFormat.format(medelprisToOre); + + System.out.printf("%s Medelpris: %s öre\n", timDel, formateratMedelPris); + + + } + } + + + static void printPriser (List priser) { priser.stream().forEach(elpriser -> System.out.printf(""" %s-%s %.2f öre\n""",elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), elpriser.sekPerKWh()*100)); @@ -202,17 +234,6 @@ public static List isSortedCombined (List elpriser) { - for (ElpriserAPI.Elpris elpris : elpriser){ - - String startTid = elpris.timeStart().format(timeFormatter); - String slutTid = elpris.timeEnd().format(timeFormatter); - String pris = numberFormat.format(elpris.sekPerKWh()*100); - - System.out.printf("%s-%s %s öre\n", startTid, slutTid, pris); - - } - } public static void skrivUtPriser(List elprisIdag,List elprisImorgon) { @@ -248,7 +269,7 @@ private static void medelPris(List prisLista) { summa += elpriser.sekPerKWh(); } double medelPrisOfDay = summa/ prisLista.size(); - System.out.printf("Medelpriser för dagen är: %s öre/KWh \n", numberFormat.format(medelPrisOfDay*100)); + System.out.printf("Medelpris: %s öre \n", numberFormat.format(medelPrisOfDay*100)); } public static void priceMinMax (List prisLista) { From 2abd22924285710f0e37dadc2679fc410e28193b Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 1 Oct 2025 13:25:23 +0200 Subject: [PATCH 18/22] =?UTF-8?q?F=C3=A4rdig=20med=20labb!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 93 +++++++---------------------- 1 file changed, 21 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 588f134e..38882312 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -7,14 +7,6 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.stream.Collectors; - - -//Att göra idag -//todo: Skapa en metod för att snygga till min switch -//todo: skapa en metod för sliding window till -charging 2h,4h,8h - -//todo: datumformatering public class Main { @@ -28,7 +20,6 @@ public static void main(String[] args) { String zoneOf = null; String dateOf = null; String chargingInput = null; - boolean isHelped = false; boolean isSorted = false; List validZones = new ArrayList<>(); @@ -38,8 +29,6 @@ public static void main(String[] args) { validZones.add("SE4"); - //Loopar igenom args och letar efter input från terminalen, case styr vad som händer om ex --zone skrivs in - //if ger nya värden till zoneOf, dateOf, chargeOf och isHelped och skickar tillbaka till main-metoden if (args.length == 0) { helpMe(); } @@ -47,36 +36,26 @@ public static void main(String[] args) { switch (args[i]) { case "--zone" -> { if (i + 1 < args.length) { zoneOf = args[++i]; - } else { helpMe(); return; - } } case "--date" -> { if (i + 1 < args.length) { dateOf = args[++i]; - - } else { helpMe(); return; } } case "--charging" -> { if (i + 1 < args.length) { chargingInput = args[++i]; - } else { helpMe(); return; } } - - case "--sorted" -> { + case "--sorted" -> isSorted = true; - } - case "--help" -> { - isHelped = true; - helpMe(); return; - } + case "--help" -> { helpMe(); return;} + } } LocalDate dagensDatum; - if (dateOf != null) try { dagensDatum = LocalDate.parse(dateOf); @@ -102,11 +81,15 @@ public static void main(String[] args) { if(priserIdag == null) { System.out.println("Kunde inte hitta några priser"); return; + } else { + System.out.println("Dagens priser:"); } List priserImorgon = elpriserApi.getPriser(tomorrow, zon); if(priserImorgon == null){ System.out.println("Kunde inte hitta några priser för imorgon"); return; + } else { + System.out.println("Morgondagens priser:"); } numberFormat.setMaximumFractionDigits(2); @@ -134,13 +117,12 @@ public static void main(String[] args) { List sorteradePriser = isSortedCombined(priserIdag, priserImorgon); printPriser(sorteradePriser); return; - } //else printhelp - skrivUtPriser(priserIdag, priserImorgon); + } + printPriser(kombineradeListor); priceMinMax(priserIdag); medelPris(priserIdag); listWith96Prices(priserIdag); - } public static List combinedLists(List priserIdag, List priserImorgon) { @@ -148,18 +130,17 @@ public static List combinedLists(List pr if (priserIdag != null) kombineradeLaddpriser.addAll(priserIdag); if (priserImorgon != null) kombineradeLaddpriser.addAll(priserImorgon); - return kombineradeLaddpriser; } public static void chargingWindow (List elpriserLadda, int timmar) { - //todo: 2,4,8 h, testa i sub-arrays(Sliding windows) + DateTimeFormatter minuteFormatter = DateTimeFormatter.ofPattern("HH:mm"); NumberFormat newFormat = NumberFormat.getNumberInstance(Locale.of("sv", "SE")); newFormat.setMaximumFractionDigits(2); newFormat.setMinimumFractionDigits(1); - if (elpriserLadda == null ||timmar<= 0|| elpriserLadda.isEmpty()|| timmar > elpriserLadda.size()) { + if (elpriserLadda == null) { System.out.println("Inga eller för få timmar för att beräkna laddningsfönster."); return; } @@ -190,15 +171,13 @@ public static void chargingWindow (List elpriserLadda, int t System.out.printf("Billigaste laddningsfönster för %dh är kl %s-%s\nMedelpris för fönster: %s öre\n Påbörja laddning %s", timmar, startTid, slutTid, formateratPris, startTid); } } - // Expected Min: Hour 0 -> avg(0.10, 0.11, 0.12, 0.13) = 0.115 SEK/kWh = 11,50 öre - // Expected Max: Hour 23 -> avg(2.40, 2.41, 2.42, 2.43) = 2.415 SEK/kWh = 241,50 öre + public static void listWith96Prices (List elpriser96) { - //behöver 24 grupper där varje grupp visar 4 priser som medelpris - //timme = 0, prisindex 1-4, (P1, P2, P3, P4) - //i är 0; sålänge i är mindre än storleken på listan; öka i med 4 + + //i är 0; så länge i är mindre än storleken på listan; öka i med 4 for (int i = 0; i < elpriser96.size(); i += 4) { - //I varje loop, stoppa de fyra värderna i en sublist + //I varje loop, stoppa de fyra värdena i en sublist List listaPerTimme = elpriser96.subList(i, i + 4); double sum = listaPerTimme.stream().mapToDouble(ElpriserAPI.Elpris::sekPerKWh).sum(); @@ -208,21 +187,17 @@ public static void listWith96Prices (List elpriser96) { int timme2 = timme +1; String timDel = String.format("%02d-%02d", timme, timme2); - //String priserIparantes = listaPerTimme.stream().map(elpris -> numberFormat.format(elpris.sekPerKWh()*100)).collect(Collectors.joining(",")); double medelprisToOre = medelPris * 100; String formateratMedelPris = numberFormat.format(medelprisToOre); System.out.printf("%s Medelpris: %s öre\n", timDel, formateratMedelPris); - - } } - - static void printPriser (List priser) { - priser.stream().forEach(elpriser -> System.out.printf(""" - %s-%s %.2f öre\n""",elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), elpriser.sekPerKWh()*100)); + priser.forEach(elpriser -> System.out.printf(""" + %s-%s %.2f öre + """,elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), elpriser.sekPerKWh()*100)); } public static List isSortedCombined (List priserIdag, List priserImorgon) { @@ -231,39 +206,14 @@ public static List isSortedCombined (List elprisIdag,List elprisImorgon) { - -//todo: Hämta elpriserna i en ArrayList för att skriva ut två dagars priser om morgondagens priser finns //List av listElpriserAPI - - List sammansattaPriser = new ArrayList<>(); - if (elprisIdag != null) { - sammansattaPriser.addAll(elprisIdag); - System.out.println("Dagens Priser:"); - for (ElpriserAPI.Elpris elpriser : elprisIdag) { - - String pris = numberFormat.format(elpriser.sekPerKWh()*100); - System.out.printf("%s-%s %s öre\n", elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), pris); - } - } - if (elprisImorgon != null) { - sammansattaPriser.addAll(elprisImorgon); - System.out.println("Morgondagens priser: "); - for (ElpriserAPI.Elpris elpriser : elprisImorgon) { - - String pris = numberFormat.format(elpriser.sekPerKWh() * 100); - System.out.printf("%s-%s %s öre\n", elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), pris); - } - } - } - private static void medelPris(List prisLista) { double summa = 0.0; if (prisLista == null) { System.out.println("Ingen data tillgänglig för medelpris"); + return; } for (ElpriserAPI.Elpris elpriser : prisLista) { summa += elpriser.sekPerKWh(); @@ -314,17 +264,16 @@ public static void helpMe() { java -cp target/classes com.example.Main [alternativ] Alternativ: - --zone SE1|SE2|SE3|SE4 (obligatoriskt) Välj elpris-zon + --zone SE1|SE2|SE3|SE4 (obligatoriskt) Välj giltig elpris-zon --date YYYY-MM-DD (valfritt) Välj datum, t.ex. 2025-09-21 --charging 2h|4h|8h (valfritt) Hitta billigaste laddningsfönster --sorted (valfritt) Sortera priser fallande --help (valfritt) Visa denna hjälptext Exempel: - java Main --zone SE3 -- date 2025-09-24 --charging 4h + java Main --zone SE3 -- date 2025-09-21 --charging 4h """); } - } // java -cp target/classes com.example.Main --zone SE2 --date 2025-09-04 --sorted From 596209e085ff3fc538493f7f1ececa639e228386 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 1 Oct 2025 14:21:56 +0200 Subject: [PATCH 19/22] =?UTF-8?q?Gjort=20=C3=A4ndringar=20efter=20feedback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 46 ++++++++++++++++------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 38882312..d61d304e 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -28,6 +28,11 @@ public static void main(String[] args) { validZones.add("SE3"); validZones.add("SE4"); + List validHours = new ArrayList<>(); + validHours.add("2h"); + validHours.add("4h"); + validHours.add("8h"); + if (args.length == 0) { helpMe(); } @@ -78,16 +83,15 @@ public static void main(String[] args) { } zon = ElpriserAPI.Prisklass.valueOf(zoneOf.toUpperCase()); List priserIdag = elpriserApi.getPriser(dagensDatum, zon); - if(priserIdag == null) { - System.out.println("Kunde inte hitta några priser"); + if(priserIdag.isEmpty()) { + System.out.println("Inga priser hittade för imorgon"); return; } else { System.out.println("Dagens priser:"); } List priserImorgon = elpriserApi.getPriser(tomorrow, zon); - if(priserImorgon == null){ - System.out.println("Kunde inte hitta några priser för imorgon"); - return; + if(priserImorgon.isEmpty()){ + System.out.println("Inga priser för imorgon hittades"); } else { System.out.println("Morgondagens priser:"); } @@ -98,15 +102,20 @@ public static void main(String[] args) { List kombineradeListor = combinedLists(priserIdag,priserImorgon); + int timmar =0; if (chargingInput != null) { - try { - //när användaren skriver 4h h ersätts med "" - timmar = Integer.parseInt(chargingInput.replace("h", "")); - - } catch (NumberFormatException e) { - helpMe(); return; - } + if (!validHours.contains(chargingInput.toLowerCase())) { + System.out.println("Ogiltig charging: " + chargingInput); + helpMe(); + return; + } + try { + timmar = Integer.parseInt(chargingInput.toLowerCase().replace("h","")); + } catch (NumberFormatException e) { + helpMe(); + return; + } } if (timmar > 0) { @@ -121,7 +130,7 @@ public static void main(String[] args) { printPriser(kombineradeListor); priceMinMax(priserIdag); medelPris(priserIdag); - listWith96Prices(priserIdag); + calculateHourlyAverages(priserIdag); } @@ -136,9 +145,7 @@ public static List combinedLists(List pr public static void chargingWindow (List elpriserLadda, int timmar) { DateTimeFormatter minuteFormatter = DateTimeFormatter.ofPattern("HH:mm"); - NumberFormat newFormat = NumberFormat.getNumberInstance(Locale.of("sv", "SE")); - newFormat.setMaximumFractionDigits(2); - newFormat.setMinimumFractionDigits(1); + if (elpriserLadda == null) { System.out.println("Inga eller för få timmar för att beräkna laddningsfönster."); @@ -166,14 +173,13 @@ public static void chargingWindow (List elpriserLadda, int t String startTid = start.timeStart().format(minuteFormatter); String slutTid = slut.timeEnd().format(minuteFormatter); double snittPris = (minSumma/timmar) * 100; - String formateratPris = newFormat.format(snittPris); + String formateratPris = numberFormat.format(snittPris); System.out.printf("Billigaste laddningsfönster för %dh är kl %s-%s\nMedelpris för fönster: %s öre\n Påbörja laddning %s", timmar, startTid, slutTid, formateratPris, startTid); } } - - public static void listWith96Prices (List elpriser96) { - + //Processar prislistan som får 96 priser + public static void calculateHourlyAverages (List elpriser96) { //i är 0; så länge i är mindre än storleken på listan; öka i med 4 for (int i = 0; i < elpriser96.size(); i += 4) { From 8e4eb4186549b8a8bb05b4122498f51225542f86 Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 1 Oct 2025 15:22:33 +0200 Subject: [PATCH 20/22] =?UTF-8?q?Gjort=20=C3=A4ndringar=20efter=20feedback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index d61d304e..e7737a67 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -84,7 +84,7 @@ public static void main(String[] args) { zon = ElpriserAPI.Prisklass.valueOf(zoneOf.toUpperCase()); List priserIdag = elpriserApi.getPriser(dagensDatum, zon); if(priserIdag.isEmpty()) { - System.out.println("Inga priser hittade för imorgon"); + System.out.println("Inga priser hittade för idag"); return; } else { System.out.println("Dagens priser:"); @@ -125,11 +125,12 @@ public static void main(String[] args) { if (isSorted) { List sorteradePriser = isSortedCombined(priserIdag, priserImorgon); printPriser(sorteradePriser); - return; } + + printPriser(kombineradeListor); - priceMinMax(priserIdag); - medelPris(priserIdag); + priceMinMax(kombineradeListor); + medelPris(kombineradeListor); calculateHourlyAverages(priserIdag); } @@ -180,17 +181,17 @@ public static void chargingWindow (List elpriserLadda, int t } //Processar prislistan som får 96 priser public static void calculateHourlyAverages (List elpriser96) { - + if (elpriser96.size() > 48) { //i är 0; så länge i är mindre än storleken på listan; öka i med 4 for (int i = 0; i < elpriser96.size(); i += 4) { //I varje loop, stoppa de fyra värdena i en sublist List listaPerTimme = elpriser96.subList(i, i + 4); double sum = listaPerTimme.stream().mapToDouble(ElpriserAPI.Elpris::sekPerKWh).sum(); - double medelPris = sum/4.0; + double medelPris = sum / 4.0; - int timme = i/4; - int timme2 = timme +1; + int timme = i / 4; + int timme2 = timme + 1; String timDel = String.format("%02d-%02d", timme, timme2); double medelprisToOre = medelPris * 100; @@ -198,6 +199,7 @@ public static void calculateHourlyAverages (List elpriser96) System.out.printf("%s Medelpris: %s öre\n", timDel, formateratMedelPris); } + } } static void printPriser (List priser) { From 4837d832c2f3b3e6f6acb0ca1016f17195adacdc Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 1 Oct 2025 15:33:05 +0200 Subject: [PATCH 21/22] =?UTF-8?q?Gjort=20=C3=A4ndringar=20efter=20feedback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index e7737a67..3b0b254b 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -174,9 +174,9 @@ public static void chargingWindow (List elpriserLadda, int t String startTid = start.timeStart().format(minuteFormatter); String slutTid = slut.timeEnd().format(minuteFormatter); double snittPris = (minSumma/timmar) * 100; - String formateratPris = numberFormat.format(snittPris); - System.out.printf("Billigaste laddningsfönster för %dh är kl %s-%s\nMedelpris för fönster: %s öre\n Påbörja laddning %s", timmar, startTid, slutTid, formateratPris, startTid); + + System.out.printf("Billigaste laddningsfönster för %dh är kl %s-%s\nMedelpris för fönster: %.2f öre\n Påbörja laddning %s", timmar, startTid, slutTid, snittPris, startTid); } } //Processar prislistan som får 96 priser @@ -195,9 +195,9 @@ public static void calculateHourlyAverages (List elpriser96) String timDel = String.format("%02d-%02d", timme, timme2); double medelprisToOre = medelPris * 100; - String formateratMedelPris = numberFormat.format(medelprisToOre); - System.out.printf("%s Medelpris: %s öre\n", timDel, formateratMedelPris); + + System.out.printf("%s Medelpris: %.2f öre\n", timDel, medelprisToOre); } } } @@ -226,8 +226,8 @@ private static void medelPris(List prisLista) { for (ElpriserAPI.Elpris elpriser : prisLista) { summa += elpriser.sekPerKWh(); } - double medelPrisOfDay = summa/ prisLista.size(); - System.out.printf("Medelpris: %s öre \n", numberFormat.format(medelPrisOfDay*100)); + double medelPrisOfDay = summa/ prisLista.size() *100; + System.out.printf("Medelpris: %.2f öre \n", medelPrisOfDay); } public static void priceMinMax (List prisLista) { @@ -244,7 +244,7 @@ public static void priceMinMax (List prisLista) { } for (ElpriserAPI.Elpris elpriser : prisLista) { - double worthOf = elpriser.sekPerKWh(); + double worthOf = elpriser.sekPerKWh() *100; if (minPris > worthOf ) { minPris = worthOf; @@ -257,8 +257,8 @@ public static void priceMinMax (List prisLista) { maxTidSlut = elpriser.timeEnd().format(timeFormatter); } } - System.out.printf("Lägsta pris för dagen: %s öre/KWh Kl: %s - %s \n", numberFormat.format(minPris*100), minTid, minTidSlut); - System.out.printf("Högsta pris för dagen: %s öre/KWh Kl: %s - %s \n", numberFormat.format(maxPris*100), maxTid, maxTidSlut); + System.out.printf("Lägsta pris för dagen: %.2f öre/KWh Kl: %s - %s \n", minPris, minTid, minTidSlut); + System.out.printf("Högsta pris för dagen: %.2f öre/KWh Kl: %s - %s \n", maxPris, maxTid, maxTidSlut); } From 8653332ced09affbe5c2ab2a82692743c79d702d Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Wed, 1 Oct 2025 15:41:24 +0200 Subject: [PATCH 22/22] =?UTF-8?q?Gjort=20=C3=A4ndringar=20efter=20feedback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 3b0b254b..445feac5 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -125,10 +125,12 @@ public static void main(String[] args) { if (isSorted) { List sorteradePriser = isSortedCombined(priserIdag, priserImorgon); printPriser(sorteradePriser); + } else { + printPriser(kombineradeListor); } - printPriser(kombineradeListor); + priceMinMax(kombineradeListor); medelPris(kombineradeListor); calculateHourlyAverages(priserIdag);