2012-07-19 17 views
6

Mam , który ma klucz String i wartość jako String, ale osiągnąłem punkt w moim projekcie, w którym muszę mieć możliwość przechowywania wielu różnych typów danych. Na przykład, będę musiał przechowywać int, String, Date itd., Wszystko w jednym Hashtable.Czy istnieje sposób na przechowywanie wielu typów danych w jednej zmiennej hashtable?

+3

Zmiana klucza na "Obiekt"? – Mysticial

+1

Czy nie jest dobrym rozwiązaniem, aby utworzyć obiekt za pomocą polecenia get/set i dodać obiekt HashTable/ArrayList (lub) do kolekcji, która jest dla ciebie interesująca? Jeśli dodasz wiele typów danych, podczas pobierania, jeśli nie znasz dokładnego indeksu i typu danych, otrzymasz klasę wyjątku. – kosa

+0

To brzmi jak bardzo delikatna struktura danych. Czy możesz opisać, co ogólnie chcesz osiągnąć, więc może ktoś może zaproponować sposób na lepszą strukturę danych? – Bobulous

Odpowiedz

7

HashTable lub dowolny Collection Map może obsłużyć tego, z wyjątkiem int i innych prymitywnych typów: nie można przechowywać prymitywnych typów, tylko Object referencje. int będzie trzeba opakować jako obiekt Integer.

+0

Więc czy będę mógł pobrać go jako typ danych, który został zapisany jako? – samwell

+2

Niezupełnie, nie - nie bez obsady, i nadal będzie wybredna.Lepiej byłoby, gdybyś korzystał z różnych map dla różnych typów, lub - jeszcze lepiej - po prostu tworząc klasę z polami o każdej z różnych nazw, zamiast mieć "Mapę", na której możesz mieć nadzieję, że wszystko jest w porządku odpowiedniego typu. –

4

Możesz przechowywać ogólny typ danych Object, ale to nie zezwoli na prymitywne typy danych.

0

Zmień HashTable do Hashtable<String, Object> i kiedy chcesz przechowywać int trzeba oddać go pierwszy (lub użyć AutoCast) do Integer. Po uzyskaniu wartości z tabeli możesz określić swój typ przez if(value instanceof String) i tak dalej dla każdego typu.

+4

Nie ma potrzeby typowania - autoboxing zrobi to automatycznie (Java 5+). – 01es

+3

Ta klasa nazywa się Hashtable i wymaga dwóch parametrów, a nie jednego. –

6
Map<String, Object> map = new HashMap<String, Object>() 

To daje mapę z klawiszami typu String i wartości typu Object, co w zasadzie oznacza żadnego potomka typu Object (Date, Integer, String itd.). Inne odpowiedzi poprawnie wskazują na to, że zamiast używać prymitywów, takich jak int, boolean, wymagane jest użycie ich odpowiedników Integer, Boolean itp.

Typ zwrotu z operacji get na takiej mapie to Object. W związku z tym to deweloper jest odpowiedzialny za prawidłowe przetwarzanie informacji o typie.

Dobra odpowiedź na pytanie, jaka jest różnica między Hashtable i HashMap jest podana here.

4

Chociaż jest to możliwe, generalnie nie jest to dobry pomysł. Częściej niż to prowadzi do wyjątków i problemów z rzutowaniem typu.

Opcja HashTable może służyć do przechowywania ogólnych obiektów w przeciwieństwie do określonych typów klas, jednak konwersja typów podczas ich pobierania nie odbywa się automatycznie.

Aby odzyskać obiekt z kolekcji, należy opracować jakąś formę procedur sprawdzania typu.

Lepiej przygotuj oddzielną kolekcję dla każdego typu klasy, który chcesz zapisać.

PS: Polecam również używanie HashMap zamiast HashTable. HashTable został wycofany.

+0

Dzięki, że tego nie wiedziałem. – samwell

Powiązane problemy