Skip to content

Commit 2ef98d5

Browse files
Ändrat tillbaka i maintest, printPrices-metod. skapat statiska fält för formatering, skapat en null-check i main för att kolla om null innan all kod körs.
1 parent e9fb009 commit 2ef98d5

File tree

2 files changed

+106
-63
lines changed

2 files changed

+106
-63
lines changed

src/main/java/com/example/Main.java

Lines changed: 99 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@
1515
//todo: hämta morgondagens priser och skriv ut dem
1616
//todo: skapa en metod för sliding window till -charging 2h,4h,8h
1717

18+
//todo: datumformatering
19+
1820

1921
public class Main {
22+
static DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH");
23+
static NumberFormat numberFormat = NumberFormat.getNumberInstance();
2024
public static void main(String[] args) {
2125

2226
ElpriserAPI elpriserApi = new ElpriserAPI();
27+
Locale.setDefault(Locale.of("sv", "SE"));
2328
System.out.println("Välkommen till Elpris-kollen!");
2429
String zoneOf = null;
2530
String dateOf = null;
@@ -34,32 +39,34 @@ public static void main(String[] args) {
3439
validZones.add("SE4");
3540

3641

37-
//Loopar igenom args och letar efter input från terminalen, case stryr vad som händer om ex --zone skrivs in
42+
//Loopar igenom args och letar efter input från terminalen, case styr vad som händer om ex --zone skrivs in
3843
//if ger nya värden till zoneOf, dateOf, chargeOf och isHelped och skickar tillbaka till main-metoden
39-
if (args.length == 0) {ifInvalidChoice();
44+
if (args.length == 0) { helpMe();
4045
}
4146

4247
for (int i = 0; i < args.length; i++) {
4348
switch (args[i]) {
4449
case "--zone" -> { if (i + 1 < args.length) {
4550
zoneOf = args[++i];
46-
} else { ifInvalidChoice();
47-
return;
51+
} else { helpMe(); return;
52+
4853
}
4954
}
5055
case "--date" -> { if (i + 1 < args.length) {
5156
dateOf = args[++i];
5257

53-
} else { ifInvalidChoice(); return;
58+
} else { helpMe(); return;
5459
}
5560
}
5661
case "--charge" -> { if (i + 1 < args.length) {
5762
isCharging = args[++i];
58-
} else { ifInvalidChoice(); return;
63+
} else { helpMe(); return;
5964
}
6065
}
6166

62-
case "--sorted" -> isSorted = true;
67+
case "--sorted" -> {
68+
isSorted = true;
69+
}
6370

6471
case "--help" -> { helpMe(); isHelped = true;
6572
}
@@ -75,7 +82,7 @@ public static void main(String[] args) {
7582
dagensDatum = LocalDate.parse(dateOf);
7683
} catch (DateTimeException e) {
7784
System.out.println("Ogiltigt datum: " + dateOf);
78-
ifInvalidChoice();
85+
helpMe();
7986
return;
8087
}
8188
else {
@@ -85,46 +92,53 @@ public static void main(String[] args) {
8592
ElpriserAPI.Prisklass zon;
8693

8794

88-
89-
9095
if (zoneOf == null || !validZones.contains(zoneOf.toUpperCase())) {
9196
System.out.println("Ogiltig zon: " + zoneOf);
92-
ifInvalidChoice();
97+
helpMe();
9398
return;
9499
}
95100
zon = ElpriserAPI.Prisklass.valueOf(zoneOf.toUpperCase());
96101
List<ElpriserAPI.Elpris> priserIdag = elpriserApi.getPriser(dagensDatum, zon);
102+
if(priserIdag == null) {
103+
System.out.println("Kunde inte hitta några priser");
104+
return;
105+
}
97106
List<ElpriserAPI.Elpris> priserImorgon = elpriserApi.getPriser(tomorrow, zon);
98-
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH");
99-
NumberFormat numberFormat = NumberFormat.getNumberInstance(new Locale("sv", "SE"));
100-
numberFormat.setMinimumFractionDigits(2);
107+
if(priserImorgon == null){
108+
System.out.println("Kunde inte hitta några priser för imorgon");
109+
return;
110+
}
111+
101112
numberFormat.setMaximumFractionDigits(2);
113+
numberFormat.setMinimumFractionDigits(2);
102114

115+
if (isSorted) {
116+
List<ElpriserAPI.Elpris> sorteradePriser = isSortedCombined(priserIdag, priserImorgon);
117+
printPriser(sorteradePriser);
118+
return;
119+
}
103120

104121
if (isCharging != null) {
105122
try {
106123
int timmar = Integer.parseInt(isCharging.replace("h", "")); //när användaren skriver 4h
107-
chargingWindow(priserIdag, timmar, timeFormatter, numberFormat);
124+
//chargingWindow(priserIdag, timmar....);
108125
} catch (NumberFormatException e) {
109-
ifInvalidChoice(); return;
126+
helpMe(); return;
110127
}
111128
}
112129

130+
skrivUtPriser(priserIdag, priserImorgon);
131+
priceMinMax(priserIdag);
132+
medelPris(priserIdag);
113133

114134

115-
skrivUtPriser(priserIdag,timeFormatter, numberFormat, "Dagens priser: ", isSorted);
116-
skrivUtPriser(priserImorgon,timeFormatter, numberFormat, "Morgondagens priser: ", isSorted);
117-
medelPris(priserIdag, numberFormat);
118-
priceMinMax(priserIdag, numberFormat, timeFormatter);
119-
120135

121136

122137
//SLiding window int min = int index = double sum =
123138
}
124139

125-
public static void chargingWindow (List<ElpriserAPI.Elpris> elpriserLadda, int timmar, DateTimeFormatter timeFormatter, NumberFormat numberFormat) {
140+
public static void chargingWindow (List<ElpriserAPI.Elpris> elpriserLadda, int timmar) {
126141
//todo: 2,4,8 h, testa i sub-arrays(Sliding windows)
127-
128142
if (elpriserLadda == null || timmar < elpriserLadda.size()) {
129143
System.out.println("Inga eller för få timmar för att beräkna laddningsfönster.");
130144
}
@@ -153,59 +167,95 @@ public static void chargingWindow (List<ElpriserAPI.Elpris> elpriserLadda, int t
153167
System.out.printf("Billigaste laddningsfönster för %dh är %s-%s, snittpris %s öre/KWh", timmar, startTid, slutTid, formateratPris);
154168
}
155169
}
170+
static void printPriser (List<ElpriserAPI.Elpris> priser) {
171+
priser.stream().forEach(elpriser -> System.out.printf("""
172+
%s-%s %.2f öre\n""",elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), elpriser.sekPerKWh()*100));
173+
}
156174

157-
public static void skrivUtPriser(List<ElpriserAPI.Elpris> elprisList, DateTimeFormatter timeFormatter, NumberFormat numberFormat, String dag, boolean isSorted) {
175+
public static List<ElpriserAPI.Elpris> isSortedCombined (List<ElpriserAPI.Elpris> priserIdag, List<ElpriserAPI.Elpris> priserImorgon) {
176+
List<ElpriserAPI.Elpris> sammansattaPriser = new ArrayList<>();
177+
sammansattaPriser.addAll(priserIdag);
178+
sammansattaPriser.addAll(priserImorgon);
179+
sammansattaPriser.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed().thenComparing(ElpriserAPI.Elpris::timeStart));
158180

159181

160-
if (elprisList == null || elprisList.isEmpty()) {
161-
System.out.println("Ingen data för " + dag + " är tillgänglig");
162-
return;
182+
return sammansattaPriser;
183+
}
184+
185+
public static void skrivUtSorteradIdag(List<ElpriserAPI.Elpris> elpriser) {
186+
for (ElpriserAPI.Elpris elpris : elpriser){
187+
188+
String startTid = elpris.timeStart().format(timeFormatter);
189+
String slutTid = elpris.timeEnd().format(timeFormatter);
190+
String pris = numberFormat.format(elpris.sekPerKWh()*100);
191+
192+
System.out.printf("%s-%s %s öre\n", startTid, slutTid, pris);
193+
163194
}
164-
if (isSorted) {
165-
elprisList.sort(Comparator.comparing(ElpriserAPI.Elpris::sekPerKWh).reversed());
195+
}
196+
public static void skrivUtSorteradImorgon(List<ElpriserAPI.Elpris> elpriser) {
197+
for (ElpriserAPI.Elpris elpris : elpriser){
198+
199+
String startTid = elpris.timeStart().format(timeFormatter);
200+
String slutTid = elpris.timeEnd().format(timeFormatter);
201+
String pris = numberFormat.format(elpris.sekPerKWh()*100);
202+
203+
System.out.printf("%s-%s %s öre\n", startTid, slutTid, pris);
166204

167205
}
168-
System.out.println(dag);
169-
for (ElpriserAPI.Elpris elpriser : elprisList) {
170-
if (!isValidElpris(elpriser)) {
171-
System.out.println("Ogiltigt elpris - hoppar över..");
172-
continue;
206+
}
207+
208+
public static void skrivUtPriser(List<ElpriserAPI.Elpris> elprisIdag,List<ElpriserAPI.Elpris> elprisImorgon) {
209+
210+
//todo: Hämta elpriserna i en ArrayList för att skriva ut två dagars priser om morgondagens priser finns //List av listElpriserAPI
211+
212+
List<ElpriserAPI.Elpris> sammansattaPriser = new ArrayList<>();
213+
if (elprisIdag != null) {
214+
sammansattaPriser.addAll(elprisIdag);
215+
System.out.println("Dagens Priser:");
216+
for (ElpriserAPI.Elpris elpriser : elprisIdag) {
217+
218+
String pris = numberFormat.format(elpriser.sekPerKWh()*100);
219+
System.out.printf("%s-%s %s öre\n", elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), pris);
173220
}
174-
String formateratPris = numberFormat.format(elpriser.sekPerKWh() * 100);
175-
System.out.println("Tid: " + elpriser.timeStart().format(timeFormatter) +"-"+ elpriser.timeEnd().format(timeFormatter) + " Pris: " + formateratPris + " öre/KWh");
176221
}
222+
if (elprisImorgon != null) {
223+
sammansattaPriser.addAll(elprisImorgon);
224+
System.out.println("Morgondagens priser: ");
225+
for (ElpriserAPI.Elpris elpriser : elprisImorgon) {
177226

227+
String pris = numberFormat.format(elpriser.sekPerKWh() * 100);
228+
System.out.printf("%s-%s %s öre\n", elpriser.timeStart().format(timeFormatter), elpriser.timeEnd().format(timeFormatter), pris);
229+
}
230+
}
178231
}
179-
public static boolean isValidElpris(ElpriserAPI.Elpris elpris) {
180-
return elpris != null &&
181-
elpris.sekPerKWh() > 0 &&
182-
elpris.timeStart() != null &&
183-
elpris.timeEnd() != null;
184-
}
185-
186232

187-
private static void medelPris(List<ElpriserAPI.Elpris> prisLista, NumberFormat numberFormat) {
233+
private static void medelPris(List<ElpriserAPI.Elpris> prisLista) {
188234
double summa = 0.0;
235+
if (prisLista == null) {
236+
System.out.println("Ingen data tillgänglig för medelpris");
237+
}
189238
for (ElpriserAPI.Elpris elpriser : prisLista) {
190239
summa += elpriser.sekPerKWh();
191240
}
192241
double medelPrisOfDay = summa/ prisLista.size();
193242
System.out.printf("Medelpriser för dagen är: %s öre/KWh \n", numberFormat.format(medelPrisOfDay*100));
194243
}
195244

196-
public static void priceMinMax (List<ElpriserAPI.Elpris> priser, NumberFormat numberFormat, DateTimeFormatter timeFormatter) {
245+
public static void priceMinMax (List<ElpriserAPI.Elpris> prisLista) {
246+
//todo: bryt ut max till en egen metod
197247
double minPris = Double.MAX_VALUE;
198248
double maxPris = Double.MIN_VALUE;
199249
String minTid = null;
200250
String minTidSlut = null;
201251
String maxTid = null;
202252
String maxTidSlut = null;
203-
if (priser.isEmpty()) {
204-
System.out.println("Ingen prisdata finns att visa");
253+
if (prisLista.isEmpty()) {
254+
System.out.println("Ingen data finns att visa");
205255
return;
206256
}
207257

208-
for (ElpriserAPI.Elpris elpriser : priser) {
258+
for (ElpriserAPI.Elpris elpriser : prisLista) {
209259
double worthOf = elpriser.sekPerKWh();
210260

211261
if (minPris > worthOf ) {
@@ -224,13 +274,6 @@ public static void priceMinMax (List<ElpriserAPI.Elpris> priser, NumberFormat nu
224274

225275
}
226276

227-
228-
//Metod som anropas om det inmatats ett felaktigt argument
229-
private static void ifInvalidChoice() {
230-
System.out.println("Ogiltigt val, du skickas nu till hjälpmeny");
231-
helpMe();
232-
233-
}
234277
// metod för --help att skickas till if-sats
235278
public static void helpMe() {
236279
System.out.println("""
@@ -248,7 +291,7 @@ public static void helpMe() {
248291
--help (valfritt) Visa denna hjälptext
249292
250293
Exempel:
251-
java Main --zone SE3 --charging 4h
294+
java Main --zone SE3 -- date 2025-09-24 --charging 4h
252295
""");
253296
}
254297

src/test/java/com/example/MainTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,13 @@ void displaySortedPrices_whenRequested() {
170170

171171
// Expected sorted output (ascending by price)
172172
List<String> expectedOrder = List.of(
173-
"Tid: 20-21 Pris: 30,00 öre/KWh",
174-
"Tid: 22-23 Pris: 20,00 öre/KWh",
175-
"Tid: 01-02 Pris: 15,00 öre/KWh",
176-
"Tid: 02-03 Pris: 15,00 öre/KWh",
177-
"Tid: 21-22 Pris: 10,00 öre/KWh",
178-
"Tid: 23-00 Pris: 10,00 öre/KWh",
179-
"Tid: 00-01 Pris: 10,00 öre/KWh"
173+
"20-21 30,00 öre",
174+
"22-23 20,00 öre",
175+
"01-02 15,00 öre",
176+
"02-03 15,00 öre",
177+
"21-22 10,00 öre",
178+
"23-00 10,00 öre",
179+
"00-01 10,00 öre"
180180
);
181181

182182
// Extract actual lines that match the pattern

0 commit comments

Comments
 (0)