(c) Krzysztof Barteczko 2014 Klasy narzędziowe (2) (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Autoboxing Klasy, opakowujące typy proste: Integer, Short, Byte, Long, Float, Double, Character, Boolean (c) Krzysztof Barteczko 2014
Specyfika działań na liczbach rzeczywistych double liczba = 3 * 0.2; double wynik = 0.6; if (liczba != wynik) System.out.println("Nie równe. Różnica wynosi: " + (liczba - wynik)); else System.out.println("Równe"); Nie równe. Różnica wynosi: 1.1102230246251565E-16 ULP (Unit in the last place) pokazuje odległość pomiędzy dwoma sąsiednimi liczbami - mówiąc dokładniej: ULP(x) to odległość między x a pierwszą dostępną liczbą większą od x i pierwszą dostępną liczbą mniejszą od x. double d1 = 1e16, d2 = d1; for(int i = 1; i<=1000000; i++) d2++; System.out.println("Różnica: " + (d2 - d1)); System.out.println("ULP = " + Math.ulp(d1)); Poza tym problem dostępnej precyzji: double licz2 = 0.1111111111111111, licz3 = 1111 + licz2, licz4 = licz3 - 1111; System.out.println(licz4 - licz2); wynik różny od 0 Różnica: 0.0 ULP = 2.0 (c) Krzysztof Barteczko 2014
BigDecimal dla dokładnych obliczeń BigDecimal liczbaA = new BigDecimal("3"); BigDecimal liczbaB = new BigDecimal("0.2"); BigDecimal wynik = liczbaA.multiply(liczbaB); if (!wynik.equals(new BigDecimal("0.6"))) System.out.println("Nie równe"); else System.out.println("Równe"); BigDecimal licz2 = new BigDecimal("0.111111111111111111111111111111111"), licz1111 = new BigDecimal("1111"), licz3 = licz1111.add(licz2), licz4 = licz3.subtract(licz1111); System.out.println(licz3); System.out.println(licz4); System.out.println(licz4.subtract(licz2).toPlainString()); Równe 1111.111111111111111111111111111111111 0.111111111111111111111111111111111 0.000000000000000000000000000000000 (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Daty - Calendar (c) Krzysztof Barteczko 2014
Operacje na kalendarzu (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Wprowadzanie dat String data = "2014-10-30"; // "2014-10-32" @SuppressWarnings("resource") Scanner s = new Scanner(data).useDelimiter("-"); Calendar c = Calendar.getInstance(); c.setLenient(false); try { c.set(s.nextInt(), s.nextInt() - 1, s.nextInt()); System.out.println(c.getTime()); } catch (Exception exc) { System.out.println("Wadliwa data: " +exc); } SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); df.setLenient(false); Date d = null; d = df.parse(data); c.setTime(d); } catch (ParseException exc) { System.out.println("Wadliwa data: " + exc); Thu Oct 30 03:35:33 CET 2014 Thu Oct 30 00:00:00 CET 2014 Wadliwa data: java.lang.IllegalArgumentException: DAY_OF_MONTH Wadliwa data: java.text.ParseException: Unparseable date: "2014-10-32" (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Nowe API dla dat i czasu (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Przykład static void show(Object o) { System.out.println(o.getClass().getSimpleName() + " -> " + o); } //... LocalDate data; LocalTime czas; LocalDateTime dacza; ZonedDateTime zdt; show( data = LocalDate.of(2014, OCTOBER, 16) ); show( czas = LocalTime.of(10, 30) ); show( LocalDateTime.of(2013, 5, 1, 0, 0) ); show( dacza = LocalDateTime.of(data, czas)); show( ZonedDateTime.now() ); show( zdt = ZonedDateTime.of(dacza, ZoneId.of("Asia/Nicosia"))); show( LocalDate.from(zdt) ); show( LocalTime.from(zdt) ); show( dacza.toLocalDate() ); show( dacza.toLocalTime() ); show( data.withDayOfMonth(10)); show( data.withMonth(8) ); show( data.withYear(2014)); LocalDate -> 2014-10-16 LocalTime -> 10:30 LocalDateTime -> 2013-05-01T00:00 LocalDateTime -> 2014-10-16T10:30 ZonedDateTime -> 2014-12-01T03:16:04.710+01:00[Europe/Belgrade] ZonedDateTime -> 2014-10-16T10:30+03:00[Asia/Nicosia] LocalDate -> 2014-10-10 LocalDate -> 2014-08-16 (c) Krzysztof Barteczko 2014
Uzyskiwanie informacji static void info(Object ... args) { for (Object o : args) { System.out.println(o); } // ... LocalDate d = LocalDate.of(2014, OCTOBER, 16); info( d, "Rok ma dni: " + d.lengthOfYear(), "Miesiąc ma dni: " + d.lengthOfMonth(), "Rok: " + d.getYear(), "Czy jest przestępny: " +d.isLeapYear(), "Miesiąc: " + d.getMonth(), "Nr miesiąca: " + d.getMonthValue(), "Dzień miesiąca: " + d.getDayOfMonth(), "Dzień tygodnia: " + d.getDayOfWeek() ); 2014-10-16 Rok ma dni: 365 Miesiąc ma dni: 31 Rok: 2014 Czy jest przestępny: false Miesiąc: OCTOBER Nr miesiąca: 10 Dzień miesiąca: 16 Dzień tygodnia: THURSDAY (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Wybrane operacje (1) (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Operacje (2) (c) Krzysztof Barteczko 2014
Formatowanie liczb i dat (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Formatowanie (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Elementy formatu (c) Krzysztof Barteczko 2014
Wybrane symbole konwersji (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Przykład double cena = 1.52; double ilosc = 3; double koszt = cena * ilosc; System.out.printf("Koszt wynosi %.2f zł", koszt); System.out.printf("\nData: %tF", Calendar.getInstance()); Koszt wynosi 4.56 zł Data: 2014-12-01 Dla lokalizacji polskiej liczba pokazywana jest z przecinkiem jako separatorem miejsc dziesiętnych. Aby uzyskać kropkę można napisać: System.out.printf(Locale.ROOT, "Koszt wynosi %.2f zł", koszt); W tym przypadku stała statyczna Locale.ROOT oznacza neutralną lokalizację (bez wybranego kraju i języka). (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Przykład 2 import static java.lang.System.*; // ... out.println("Wyrównany wydruk tablicy"); int[] arr = { 1, 100, 200, 4000 }; for (int i = 0; i < arr.length; i++) { out.printf("%5d", arr[i]); if (i%2!=0) System.out.println(); } // Zastosowanie znaku formatu <"); out.println("Zaokraglenia"); out.printf("%.3f %<.2f %<.1f", 1.256 ); // Znak < szczególnie przydatny w datach/czasie Calendar c = Calendar.getInstance(); c.set(2013, 1, 1); out.printf("\nW roku %tY i miesiącu %<tm mamy %d dni", c, c.getActualMaximum(Calendar.DATE) ); // Oczywiście możemy formatować do Stringów String dateNow = String.format("%td-%<tm-%<tY", currentTimeMillis()); JOptionPane.showMessageDialog(null, dateNow); Wyrównany wydruk tablicy 1 100 200 4000 Zaokraglenia 1.256 1.26 1.3 W roku 2013 i miesiącu 02 mamy 28 dni (c) Krzysztof Barteczko 2014
(c) Krzysztof Barteczko 2014 Formatowanie dat Calendar cal = Calendar.getInstance(); String[] daty = { "2014-09-01", "2013-09-06", "1999-02-05" }; String patt = "d MMMM yyyy (EEEE)"; for (String s : daty) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); cal.setTime(df.parse(s)); cal.add(Calendar.DATE, 1); df.applyLocalizedPattern(patt); String outd = df.format(cal.getTime()); System.out.println(outd); // Prościej w Java 8 LocalDate dat = LocalDate.parse(s).plusDays(1); String old = dat.format( DateTimeFormatter.ofPattern(patt, new Locale("pl"))); System.out.println(old); } 2 września 2014 (wtorek) 7 września 2013 (sobota) 6 lutego 1999 (sobota) (c) Krzysztof Barteczko 2014