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
1921public 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
0 commit comments