Odwrotna Notacja Polska - część 2

W poprzedniej części (Odwrotna Notacja Polska - część 1) dokonaliśmy zamiany wyrażenia w formie infiksowej na postać postfiksową (czyli formę w Odwrotnej Notacji Polskiej). W tym wpisie spróbujemy dokonać sprawdzenia poprawności nawiasów występujących w wyrażeniu infiksowym oraz obliczymy wartość wyrażenia postfiksowego. Do sprawdzenia poprawności nawiasów w wyrażeniu infiksowym użyjemy stosu (więcej na ten temat - Sprawdzanie poprawności nawiasów). Jeśli wyrażenie nie będzie poprawne pod wartość wyrażenia postfiksowego podstawimy odpowiedni napis (klasa String - "Niepoprawne nawiasy w wyrażeniu infiksowym"). Nasza metoda sprawdzająca poprawność nawiasów będzie metodą prywatną:

Piszemy gadżet do Bloggera - część 2

W poprzedniej części (Piszemy gadżet do Bloggera - część 1) poznaliśmy podstawy pisania gadżetu oraz jego strukturę. Dzisiaj poznamy sposoby jego konfigurowania przez użytkownika. Pozwolimy użytkownikowi na podanie dodatkowych informacji podczas dodawania gadżetu do bloga. Dzięki temu użytkownik będzie mógł zdecydować np. o kolorach, napisach czy innych opcjach związanych z konkretnym gadżetem. Sekcją odpowiedzialną za preferencje jest <UserPref>. Opisuje ona pola, które będzie mógł modyfikować użytkownik podczas konfiguracji gadżetu. Pola mogą mieć następujące atrybuty:

Odwrotna Notacja Polska - część 1

Odwrotna Notacja Polska to sposób zapisu wyrażeń arytmetycznych za pomocą notacji postfiksowej. Standardowa notacja, z której korzystamy na codzień to notacja infiksowa, argument operator argument (np. 3 + 4). Notacja postfiksowa nie zmienia kolejności argumentów, natomiast zmienia położenie operatorów (występują one po argumentach, których dotyczą). Przykładowy zapis w notacji postfiksowej wyglada tak: 3 4 +. Taki sposób zapisu jest o wiele łatwiejszy do analizy poprawności wyrażenia jak i do jego obliczenia. Wykorzystując stos w prosty sposób możemy dokonać zamiany wyrażenia z postaci infiksowej na postać postfiksową. Algorytm zamiany jest następujący:

Klasa LinkedList - przykład zastosowania

Klasa LinkedList jest jedną z klas bibliotecznych dostępnych w standardowej Javie. Jest to prosta implementacja listy powiązanej z wykorzystaniem typów generycznych (pisałem o nich tutaj Typy generyczne). Na jej bazie możemy napisać implementację w pełni dynamicznego stosu (inne sposoby tworzenia stosu to Stos - implementacja tablicowa oraz Lista powiązana - własna implementacja). Nasze rozwiązanie dzięki zastosowaniu typów generycznych umożliwi obsługę dowolnych obiektów.

Typy generyczne

Java od wersji 1.5 obsługuje typy generyczne. Pozwalają one sparametryzować klasę, przez co nie ma konieczności dokonywania później kłopotliwego rzutowania. Sam zapis typu generycznego to duża litera/litery ujęta w nawiasy ostre. Utwórzmy prostą klasę Pudelko przechowującą elementy dowolnego typu.
/**
 * Wykorzystanie typów generycznych 
 * @author kodatnik.blogspot.com
 */
class Pudelko <T> {
 // referencja do obiektu typu T
 private T element; 

 // konstruktor klasy
 public Pudelko(T element) {
  this.element = element;
 } 

 // metoda zwraca referencję do przechowywanego elementu
 public T pobierzElement() {
  return element;
 }
}
Tworząc obiekt klasy Pudelko musimy określić jakiego typu dane będą w nim przechowywane. Przykładowe wykorzystanie klasy Pudelko.
public class TestPudelka {
 public static void main(String args[]) {
    
  // tworzymy trzy pudełka dla różnych typów danych (String, Integer oraz Double)
  Pudelko<String>  p1 = new Pudelko<String>("Ala ma kota");
  Pudelko<Integer> p2 = new Pudelko<Integer>(12);     
  Pudelko<Double>  p3 = new Pudelko<Double>(24.76);   
  
  // sprawdzamy zawartość każdego pudełka
  System.out.println (p1.pobierzElement());
  
  int wartosc = p2.pobierzElement() + 3;
  System.out.println (wartosc);
  
  System.out.println (p3.pobierzElement());    
 }
}
Wynik działania aplikacji (pudełko pierwsze przechowuje łańcuchy tekstowe, drugie liczby całkowite, a trzecie liczby rzeczywiste).
Ala ma kota
15
24.76
Większość klas dostarczanych z Javą wykorzystuje typy generyczne. Są to zazwyczaj klasy będące "pojemnikami" dla innych obiektów (tzw. kolekcje). Na przykład klasy LinkedList, Array, Stack, Vector, TreeMap itp.
Typy generyczne przeznaczone są tylko do typów obiektowych, nie można ich użyć do typów prymitywnych.

Popularne posty