# Hashtable/Vector - immer nur letzter Eintrag vorhanden



## drschwalbenmann (6. Jan 2009)

Hallo.

Ich habe ein wenig mit NetBeans für mein Sony-Ericsson herum experimentiert. Ich lese zur Laufzeit eine CSV Datei ein und schreibe sie in eine Hashtable. Später möchte ich dann auf Einträge der Hashtable zugreifen.
Das Einlesen funktioniert auch soweit ohne Fehler, aber beim Suchen nach Einträgen sind immer alle Einträge bis auf den letzten verschwunden. Die size zeigt aber die korrekte Größe an. Im Emulator funktioniert alles aber wie es soll...
Aus Frust bin ich auf einen Vector umgeschwenkt, aber auch hier genau das selbe...

Hat irgendwer eine Ahung was ich falsch mache?

Gruß, Andreas


----------



## SlaterB (6. Jan 2009)

was verstehst du denn unter 'Suchen'?
das hängt doch stark von der Art der enthaltenen Objekte under der Keys (bei der Map) ab, von den Inhalt der equals-Methoden, hashCode() usw,
poste komplette Beispielprogramme


----------



## drschwalbenmann (6. Jan 2009)

Mit "Suchen" meinte ich get().

Hier mal die Variante mit Hashtable...

```
Hashtable test = new Hashtable();
    Calendar temp = Calendar.getInstance();
    int i = 0;

    temp.set(Calendar.HOUR_OF_DAY, 0);
    temp.set(Calendar.MINUTE, 0);
    temp.set(Calendar.SECOND, 0);
    temp.set(Calendar.MILLISECOND, 0);

    for(i = 1; i < 2; i++) {
        temp.set(Calendar.DATE, i);
        temp.set(Calendar.MONTH, 0);
        temp.set(Calendar.YEAR, 2009);
        test.put(temp.getTime(), i);
    }

    System.out.println(test.get(dateField.getDate())); // dateField = 01.01.2009
    ...
    System.out.println(test.get(dateField.getDate())); // dateField = 02.01.2009

    System.out.println(test.containsKey(dateField.getDate())); // dateField = 01.01.2009
    ...
    System.out.println(test.containsKey(dateField.getDate())); // dateField = 02.01.2009

    System.out.println(test.size());
```

Der Output:

```
null
2
false
true
2
```


----------



## SlaterB (6. Jan 2009)

kann nicht sein, die Schleife 
>  for(i = 1; i < 2; i++) { 
fügt ja nur ein Element hinzu 

jedenfalls ist dein Programm nicht vollständig und daher ohne Aussage,
bei mir gehts:


```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {

        Hashtable test = new Hashtable();
        Calendar temp = Calendar.getInstance();
        int i = 0;

        temp.set(Calendar.HOUR_OF_DAY, 0);
        temp.set(Calendar.MINUTE, 0);
        temp.set(Calendar.SECOND, 0);
        temp.set(Calendar.MILLISECOND, 0);

        for (i = 1; i <= 2; i++)
        {
            temp.set(Calendar.DATE, i);
            temp.set(Calendar.MONTH, 0);
            temp.set(Calendar.YEAR, 2009);
            test.put(temp.getTime(), i);
        }

        Date date = new Date(109, 0, 1);
        System.out.println(test.get(date));
        System.out.println(test.containsKey(date));
        date = new Date(109, 0, 2);
        System.out.println(test.get(date));
        System.out.println(test.containsKey(date));

        System.out.println(test.size());

    }
}

-------

1
true
2
true
2
```


----------



## drschwalbenmann (6. Jan 2009)

Also in dem Emulator von NetBeans gehts bei mir auch - auf dem Handy aber nicht...


----------



## SlaterB (6. Jan 2009)

meinst du mein Programm oder deins?

falls du ein konkretes vollständiges Programm zusammengestellt hat, kann man das ja um weitere Ausgaben erweitern, 
z.B. an beiden Stellen (beim Einfügen und Auslesen) den HashCode loggen, falls das auf deinem Handy möglich ist

vielleicht verwendest du unterschiedliche Klassen oder Calendar.getInstance(); hat ne andere Zeitzone als deine andere Datumsquelle oder oder..


----------



## drschwalbenmann (6. Jan 2009)

Möglich das mein Quelltext so nicht funktioniert, war ja nur ein Beispiel, aber davon mal abgesehen gibt es deine Date(109, 0, 1)-Initialisierung bei meinem J2ME nicht. Im kompletten Java vllt aber nicht im J2ME.

Wie dem auch sei, ich hab das Problem gefunden.
Scheinbar macht mein Handy bei 
	
	
	
	





```
test.put(temp.getTime(), i);
```
 einfach ne Referenz auf temp, weil beim nächsten Schleifendurchlauf ist das Element auf einmal auch der 02.01.2009. Der Emulator macht aber wirklich eine Kopie und erstellt einen neuen Speicherbereich dafür, verrückt.

Ich hab das jetzt einfach so abgewandelt: 
	
	
	
	





```
test.put(new Date(temp.getTime().getTime()), i);
```
Und damit funktionierts.

Vielen Dank, Andreas


----------

