Hashtable

Odpowiedz Nowy wątek
2010-11-08 19:52
Nutria
0

Mam taki Singleton:
import java.util.Hashtable;
public final class Cennik extends Hashtable {
private final static Cennik c = new Cennik();
private Cennik() {}
public static Cennik getCennik() {
return c;
}

public void set(String produkt, double cena) {
    Hashtable<String,Double> ht = new Hashtable<String, Double>();
    double d =cena;
    String s = produkt;
    ht.put(s, new Double(d));

}

}
Chciałabym w klasie Kasa w metodzie printBill() wypisywać ceny obiektów, ale nie wiem jak niestety.

import java.util.Vector;
class Kasa {
Koszyk k;
public void printBilll(Koszyk k) {
System.out.println("Kasa - rachunek za ["+k +"]:");
for (int i = 0; i < k.size(); i++)
System.out.println();

}

}

Pozostało 580 znaków

2010-11-08 19:58
0

Skoro już roszerzasz to lepiej rozszerz HashMap i dodaj genericsy czyli zamiast "extends Hashtable" zrób "extends HashMap<String, Double>".

W metodzie set zamiast ht.put(..., ...) zrób po prostu put(..., ...) ponieważ rozszerzasz klasę która tą metodę obsługuje przecież. Nie twórz za każdym razem nowej mapy, bo nie ma po co.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2010-11-08 20:00
Nutria
0

To musi być Hashtable.

Pozostało 580 znaków

2010-11-08 22:15
0

No to niech będzie i Hashtable. Tak samo się go parametryzuje i tak samo implementuje interfejs Map<K, V>.


import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;

class Cennik extends Hashtable<String, Double> {

    private Cennik() {
    }

    private static class SingletonHolder {
        private static final Cennik INSTANCE = new Cennik();
    }

    public static Cennik getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

class Koszyk extends Hashtable<String, Integer> {

    public synchronized boolean add(String key, Integer value) {
        boolean wasPresent = containsKey(key);
        if (wasPresent) {
            Integer oldValue = get(key);
            put(key, oldValue + value);
        } else {
            put(key, value);
        }
        return wasPresent;
    }
}

public class Main {

    void run() {
        Cennik.getInstance().put("Mleko", 5.0);
        Cennik.getInstance().put("Kakao", 10.0);

        Koszyk koszyk = new Koszyk();
        koszyk.add("Mleko", 5);
        koszyk.add("Kakao", 8);
        koszyk.add("Kakao", 9);

        for (Entry<String, Integer> pozycja : koszyk.entrySet()) {
            String nazwaTowaru = pozycja.getKey();
            Integer ilośćTowaru = pozycja.getValue();
            Double cenaTowaru = Cennik.getInstance().get(nazwaTowaru);
            Double wartośćTowaru = cenaTowaru * ilośćTowaru;
            System.out.println("Typ: " + nazwaTowaru + ", ilość: " + ilośćTowaru +
                    ", cena: " + cenaTowaru + ", wartość: " + wartośćTowaru);
        }
    }

    public static void main(String[] args) {
        new Main().run();
    }
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2010-11-09 16:27
Nutria
0

Trochę nie o to mi chodziło. Przerobiłam moje klasy i mam:
import java.util.Hashtable;
public final class Cennik extends Hashtable {
Hashtable<String,Double> ht = new Hashtable<String,Double>();
private double d;
private String s;
private static Cennik c = new Cennik();
private Cennik() {}
public static Cennik getCennik() {
return c;
}

public void set(String produkt, double cena) {
    d = cena;
    s = produkt;
    ht.put(s, new Double(d));
}

}

import java.util.Vector;
import java.util.Hashtable;
class Kasa extends Hashtable {
Koszyk k;
Hashtable ht;
public void printBilll(Koszyk k) {
System.out.println("Kasa - rachunek za ["+k +"]:");
for (int i = 0; i < k.size(); i++) {
Owoce o =(Owoce) k.get(i);
String s = o.getNazwa();
Object n = ht.get(s);
Double val = (Double) n;
double dv = val.doubleValue();
String napis = dv+ " zł/kg = ";
System.out.println(k.get(i) + " *"+napis);

    }
}

}

Kompiluje się ale potem przy uruchamianiu programu głównego jest tak:
Exception in thread "main" java.lang.NullPointerException
at Kasa.printBilll(Kasa.java:11)

Pozostało 580 znaków

2010-11-09 16:56
0
  1. Po ch*j robisz "extends Hashtable" (i w dodatku omijasz genericsy!!!) i dajesz pole typu Hashtable? Albo to albo tamto, wystarczy ci jedno Hashtable.

  2. Nie widzę procedury startowej.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2010-11-09 16:59
0

Po co Cennik dziedziczy po Hashtable, a potem w set do niego deleguje?
Po co Cennikowi pola d i s?
Po co Kasie pole k, skoro Koszyk podaje się jako argument printBill?
Po co Kasie pole ht, skoro dziedziczy po Hashtable?
Po co rzutować obiekty zwracane przez Hashtable.get, skoro można tą kolekcję sparametryzować?
A co do NPE, to zapewne wyrzuca go tutaj:

Object n = ht.get(s);

ht nie jest nigdzie inicjalizowane.

edytowany 3x, ostatnio: iooi, 2010-11-09 17:01

Pozostało 580 znaków

2010-11-09 17:13
Nutria
0

//Object n = ht.get(s);
ht nie jest nigdzie inicjalizowane//
jak zainicjalizować?

Pozostało 580 znaków

2010-11-09 17:29
0
Hashtable ht = new Hashtable<Cośtam, Cośtam>();

(bo ht tylko zadeklarowałaś i wciąż jest nullem)
Ale trzeba to jeszcze czymś wypełnić. Ja naprawdę nie mam pojęcia, do czego to ma służyć. Co się tobie nie podoba w kodzie donkeya?

edytowany 2x, ostatnio: iooi, 2010-11-09 17:38

Pozostało 580 znaków

2010-11-09 17:38
Nutria
0

To się wypełnia w klasie głównej przy pomocy metody set (jest w Cenniku)
public void set(String produkt, double cena) {
ht.put(produkt, new Double(cena));
Obiekty tworzą tablicę (przy pomocy klasy Vector z java.util) i teraz chcę z tej tablicy wydostać dla każdego obiektu wartość double metodą z Hashtable get().

Pozostało 580 znaków

2010-11-09 17:40
0

Okej, ale to zapewne wypełnia obiekt ht z Cennika, drugi taki obiekt ht masz w Kasie. A to dwa różne obiekty :d

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0