77import java .time .LocalDate ;
88import java .time .format .DateTimeFormatter ;
99import java .util .*;
10- import java .util .stream .Collectors ;
11-
12-
13- //Att göra idag
14- //todo: Skapa en metod för att snygga till min switch
15- //todo: skapa en metod för sliding window till -charging 2h,4h,8h
16-
17- //todo: datumformatering
1810
1911
2012public class Main {
@@ -28,7 +20,6 @@ public static void main(String[] args) {
2820 String zoneOf = null ;
2921 String dateOf = null ;
3022 String chargingInput = null ;
31- boolean isHelped = false ;
3223 boolean isSorted = false ;
3324
3425 List <String > validZones = new ArrayList <>();
@@ -38,45 +29,33 @@ public static void main(String[] args) {
3829 validZones .add ("SE4" );
3930
4031
41- //Loopar igenom args och letar efter input från terminalen, case styr vad som händer om ex --zone skrivs in
42- //if ger nya värden till zoneOf, dateOf, chargeOf och isHelped och skickar tillbaka till main-metoden
4332 if (args .length == 0 ) { helpMe ();
4433 }
4534
4635 for (int i = 0 ; i < args .length ; i ++) {
4736 switch (args [i ]) {
4837 case "--zone" -> { if (i + 1 < args .length ) {
4938 zoneOf = args [++i ];
50- } else { helpMe (); return ;
51-
5239 }
5340 }
5441 case "--date" -> { if (i + 1 < args .length ) {
5542 dateOf = args [++i ];
56-
57- } else { helpMe (); return ;
5843 }
5944 }
6045 case "--charging" -> { if (i + 1 < args .length ) {
6146 chargingInput = args [++i ];
62- } else { helpMe (); return ;
6347 }
6448 }
65-
66- case "--sorted" -> {
49+ case "--sorted" ->
6750 isSorted = true ;
68- }
6951
70- case "--help" -> {
71- isHelped = true ;
72- helpMe (); return ;
73- }
52+ case "--help" -> { helpMe (); return ;}
53+
7454 }
7555
7656 }
7757 LocalDate dagensDatum ;
7858
79-
8059 if (dateOf != null )
8160 try {
8261 dagensDatum = LocalDate .parse (dateOf );
@@ -102,11 +81,15 @@ public static void main(String[] args) {
10281 if (priserIdag == null ) {
10382 System .out .println ("Kunde inte hitta några priser" );
10483 return ;
84+ } else {
85+ System .out .println ("Dagens priser:" );
10586 }
10687 List <ElpriserAPI .Elpris > priserImorgon = elpriserApi .getPriser (tomorrow , zon );
10788 if (priserImorgon == null ){
10889 System .out .println ("Kunde inte hitta några priser för imorgon" );
10990 return ;
91+ } else {
92+ System .out .println ("Morgondagens priser:" );
11093 }
11194
11295 numberFormat .setMaximumFractionDigits (2 );
@@ -134,32 +117,30 @@ public static void main(String[] args) {
134117 List <ElpriserAPI .Elpris > sorteradePriser = isSortedCombined (priserIdag , priserImorgon );
135118 printPriser (sorteradePriser );
136119 return ;
137- } //else printhelp
138- skrivUtPriser ( priserIdag , priserImorgon );
120+ }
121+ printPriser ( kombineradeListor );
139122 priceMinMax (priserIdag );
140123 medelPris (priserIdag );
141124 listWith96Prices (priserIdag );
142125
143-
144126 }
145127
146128 public static List <ElpriserAPI .Elpris > combinedLists (List <ElpriserAPI .Elpris > priserIdag , List <ElpriserAPI .Elpris > priserImorgon ) {
147129 List <ElpriserAPI .Elpris > kombineradeLaddpriser = new ArrayList <>();
148130 if (priserIdag != null ) kombineradeLaddpriser .addAll (priserIdag );
149131 if (priserImorgon != null ) kombineradeLaddpriser .addAll (priserImorgon );
150132
151-
152133 return kombineradeLaddpriser ;
153134 }
154135
155136 public static void chargingWindow (List <ElpriserAPI .Elpris > elpriserLadda , int timmar ) {
156- //todo: 2,4,8 h, testa i sub-arrays(Sliding windows)
137+
157138 DateTimeFormatter minuteFormatter = DateTimeFormatter .ofPattern ("HH:mm" );
158139 NumberFormat newFormat = NumberFormat .getNumberInstance (Locale .of ("sv" , "SE" ));
159140 newFormat .setMaximumFractionDigits (2 );
160141 newFormat .setMinimumFractionDigits (1 );
161142
162- if (elpriserLadda == null || timmar <= 0 || elpriserLadda . isEmpty ()|| timmar > elpriserLadda . size () ) {
143+ if (elpriserLadda == null ) {
163144 System .out .println ("Inga eller för få timmar för att beräkna laddningsfönster." );
164145 return ;
165146 }
@@ -190,15 +171,13 @@ public static void chargingWindow (List<ElpriserAPI.Elpris> elpriserLadda, int t
190171 System .out .printf ("Billigaste laddningsfönster för %dh är kl %s-%s\n Medelpris för fönster: %s öre\n Påbörja laddning %s" , timmar , startTid , slutTid , formateratPris , startTid );
191172 }
192173 }
193- // Expected Min: Hour 0 -> avg(0.10, 0.11, 0.12, 0.13) = 0.115 SEK/kWh = 11,50 öre
194- // Expected Max: Hour 23 -> avg(2.40, 2.41, 2.42, 2.43) = 2.415 SEK/kWh = 241,50 öre
174+
195175 public static void listWith96Prices (List <ElpriserAPI .Elpris > elpriser96 ) {
196- //behöver 24 grupper där varje grupp visar 4 priser som medelpris
197- //timme = 0, prisindex 1-4, (P1, P2, P3, P4)
198176
199- //i är 0; sålänge i är mindre än storleken på listan; öka i med 4
177+
178+ //i är 0; så länge i är mindre än storleken på listan; öka i med 4
200179 for (int i = 0 ; i < elpriser96 .size (); i += 4 ) {
201- //I varje loop, stoppa de fyra värderna i en sublist
180+ //I varje loop, stoppa de fyra värdena i en sublist
202181 List <ElpriserAPI .Elpris > listaPerTimme = elpriser96 .subList (i , i + 4 );
203182
204183 double sum = listaPerTimme .stream ().mapToDouble (ElpriserAPI .Elpris ::sekPerKWh ).sum ();
@@ -208,21 +187,17 @@ public static void listWith96Prices (List<ElpriserAPI.Elpris> elpriser96) {
208187 int timme2 = timme +1 ;
209188
210189 String timDel = String .format ("%02d-%02d" , timme , timme2 );
211- //String priserIparantes = listaPerTimme.stream().map(elpris -> numberFormat.format(elpris.sekPerKWh()*100)).collect(Collectors.joining(","));
212190 double medelprisToOre = medelPris * 100 ;
213191 String formateratMedelPris = numberFormat .format (medelprisToOre );
214192
215193 System .out .printf ("%s Medelpris: %s öre\n " , timDel , formateratMedelPris );
216-
217-
218194 }
219195 }
220196
221-
222-
223197 static void printPriser (List <ElpriserAPI .Elpris > priser ) {
224- priser .stream ().forEach (elpriser -> System .out .printf ("""
225- %s-%s %.2f öre\n """ ,elpriser .timeStart ().format (timeFormatter ), elpriser .timeEnd ().format (timeFormatter ), elpriser .sekPerKWh ()*100 ));
198+ priser .forEach (elpriser -> System .out .printf ("""
199+ %s-%s %.2f öre
200+ """ ,elpriser .timeStart ().format (timeFormatter ), elpriser .timeEnd ().format (timeFormatter ), elpriser .sekPerKWh ()*100 ));
226201 }
227202
228203 public static List <ElpriserAPI .Elpris > isSortedCombined (List <ElpriserAPI .Elpris > priserIdag , List <ElpriserAPI .Elpris > priserImorgon ) {
@@ -231,39 +206,14 @@ public static List<ElpriserAPI.Elpris> isSortedCombined (List<ElpriserAPI.Elpris
231206 sammansattaPriser .addAll (priserImorgon );
232207 sammansattaPriser .sort (Comparator .comparing (ElpriserAPI .Elpris ::sekPerKWh ).reversed ().thenComparing (ElpriserAPI .Elpris ::timeStart ));
233208
234-
235209 return sammansattaPriser ;
236210 }
237211
238- public static void skrivUtPriser (List <ElpriserAPI .Elpris > elprisIdag ,List <ElpriserAPI .Elpris > elprisImorgon ) {
239-
240- //todo: Hämta elpriserna i en ArrayList för att skriva ut två dagars priser om morgondagens priser finns //List av listElpriserAPI
241-
242- List <ElpriserAPI .Elpris > sammansattaPriser = new ArrayList <>();
243- if (elprisIdag != null ) {
244- sammansattaPriser .addAll (elprisIdag );
245- System .out .println ("Dagens Priser:" );
246- for (ElpriserAPI .Elpris elpriser : elprisIdag ) {
247-
248- String pris = numberFormat .format (elpriser .sekPerKWh ()*100 );
249- System .out .printf ("%s-%s %s öre\n " , elpriser .timeStart ().format (timeFormatter ), elpriser .timeEnd ().format (timeFormatter ), pris );
250- }
251- }
252- if (elprisImorgon != null ) {
253- sammansattaPriser .addAll (elprisImorgon );
254- System .out .println ("Morgondagens priser: " );
255- for (ElpriserAPI .Elpris elpriser : elprisImorgon ) {
256-
257- String pris = numberFormat .format (elpriser .sekPerKWh () * 100 );
258- System .out .printf ("%s-%s %s öre\n " , elpriser .timeStart ().format (timeFormatter ), elpriser .timeEnd ().format (timeFormatter ), pris );
259- }
260- }
261- }
262-
263212 private static void medelPris (List <ElpriserAPI .Elpris > prisLista ) {
264213 double summa = 0.0 ;
265214 if (prisLista == null ) {
266215 System .out .println ("Ingen data tillgänglig för medelpris" );
216+ return ;
267217 }
268218 for (ElpriserAPI .Elpris elpriser : prisLista ) {
269219 summa += elpriser .sekPerKWh ();
@@ -314,17 +264,16 @@ public static void helpMe() {
314264 java -cp target/classes com.example.Main [alternativ]
315265
316266 Alternativ:
317- --zone SE1|SE2|SE3|SE4 (obligatoriskt) Välj elpris-zon
267+ --zone SE1|SE2|SE3|SE4 (obligatoriskt) Välj giltig elpris-zon
318268 --date YYYY-MM-DD (valfritt) Välj datum, t.ex. 2025-09-21
319269 --charging 2h|4h|8h (valfritt) Hitta billigaste laddningsfönster
320270 --sorted (valfritt) Sortera priser fallande
321271 --help (valfritt) Visa denna hjälptext
322272
323273 Exempel:
324- java Main --zone SE3 -- date 2025-09-24 --charging 4h
274+ java Main --zone SE3 -- date 2025-09-21 --charging 4h
325275 """ );
326276 }
327-
328277}
329278
330279// java -cp target/classes com.example.Main --zone SE2 --date 2025-09-04 --sorted
0 commit comments