2013-05-19 15 views
5

Mam mapęJak przekonwertować HashMap do tablicy wpisów

private HashMap<Character, Integer> map;

Chcę, aby przekształcić go do tablicy, ale gdy to zrobić/mogę to:

Entry<Character, Integer> t = map.entrySet().toArray();  
**Type mismatch: cannot convert from Object[] to Map.Entry<Character,Integer>** 

Entry<Character, Integer>[] t = null; 
map.entrySet().toArray(t); 
**Exception in thread "main" java.lang.NullPointerException** 

Entry<Character, Integer>[] t = new Entry<Character, Integer>[1]; 
map.entrySet().toArray(t); 
    **Cannot create a generic array of Map.Entry<Character,Integer>** 

Entry<Character, Integer>[] t = null; 
t = map.entrySet().toArray(t); 
**Exception in thread "main" java.lang.NullPointerException** 

Jak przekonwertować HashMap do Array? Żadna z odpowiedzi znalezionych w innych tematach nie działa.

+1

http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation Chodzi o to, że jest n możliwe jest utworzenie ogólnej tablicy, takiej jak 'Entry []'. Zamiast tego użyj 'List >'. – Natix

Odpowiedz

11

myślę, że to będzie działać:

Entry<Character, Integer>[] t = (Entry<Character, Integer>[]) 
     (map.entrySet().toArray(new Map.Entry[map.size()]));  

... ale trzeba adnotację @SuppressWarning tłumić ostrzeżenie o niebezpiecznym typecast.

+0

Tak, udało się .. świetnie! Prawdziwa magia. – Yoda

1

Nie jestem pewien dokładnie, na jakie sposoby próbowałeś. Co chciałbym zrobić to

Kiedy to zrobisz dostaniesz EntrySet, więc dane będą przechowywane jako Entry

Więc jeśli chcesz zachować go w EntrySet można to zrobić:

List<Entry<Character, Integer>> list = new ArrayList<Entry<Character, Integer>>(); 

for(Entry<Character, Integer> entry : map.entrySet()) { 
    list.add(entry); 
} 

Należy również pamiętać, że zawsze możesz liczyć na inną kolejność, gdy robi to, jak HashMap nie jest uporządkowane.

Albo można zrobić klasę trzymać dane wstępne:

public class Data { 
    public Character character; 
    public Integer value; 

    public Data(Character char, Integer value) { 
     this.character = character; 
     this.value = value; 
    } 
} 

i rozpakuj go za pomocą:

List<Data> list = new ArrayList<Data>(); 

for(Entry<Character, Integer> entry : map.entrySet()) { 
    list.add(new Data(entry.getKey(), entry.getValue())); 
} 
0

Inny wariant, który wygląda trochę czystsze (ale nadal wymaga @SuppressWarnings):

@SuppressWarnings("unchecked") 
Entry<Character, Integer>[] t = map.entrySet().toArray(new Entry[map.size()]); 
Powiązane problemy