2009-06-14 13 views
32

Z Sun Java Tutorial, pomyślałem, że ten kod zamieni zestaw w tablicę.Java: Konwertowanie zestawu do tablicy na reprezentację ciągów

import java.util.*; 

public class Blagh { 
    public static void main(String[] args) { 
     Set<String> set = new HashSet<String>(); 
     set.add("a"); 
     set.add("b"); 
     set.add("c"); 
     String[] array = set.toArray(new String[0]); 
     System.out.println(set); 
     System.out.println(array); 
    } 
} 

to jednak daje

[a, c, b] 
[Ljava.lang.String;@9b49e6 

Co ja niezrozumiany?

+2

"[Ljava.lang.String; @ 9b49e6" JEST tablicą łańcuchów. – Fredrik

+0

Czy kolejność elementów była w tym dokładna? Mam podobną sytuację, gdy wydaje się, że zamówienie ma własny umysł, a nie w kolejności dodawania przedmiotów. – electrichead

+0

Zestawy ogólnie nie mają zdefiniowanej kolejności, więc nie można polegać na kolejności, w jakiej elementy zostały umieszczone w zestawie, w takiej samej kolejności, w jakiej je zamówiono. Wypróbuj implementację LinkedHashSet interfejsu Set, jeśli tego chcesz; dodaje tę gwarancję. – Frans

Odpowiedz

32

Kod działa poprawnie.

Wymienić:

System.out.println(array); 

Z:

System.out.println(Arrays.toString(array)); 

wyjściowa:

 
[b, c, a] 
[b, c, a] 

String reprezentację tablicy wyświetla się "tekstową reprezentację" tablicy, uzyskanych przez Object.toString - która jest nazwą klasy i kodem haszowania tablicy jako ciąg szesnastkowy.

+0

Niektóre części Javy mogą być trochę nieprzyjazne. – coobird

+1

To nie jest adres, ale Object.hashCode() ... – Joey

+0

Dobra rozmowa, naprawię to, dzięki! – coobird

1

Nie sądzę, że źle zrozumiałeś cokolwiek; kod powinien zadziałać. Tablica, jednak nie jest na tyle silny, aby wydrukować jego zawartość w metodzie toString, więc trzeba wydrukować zawartość z

for(String s : array) println(s); 

czy coś takiego.

5

Jest OK.

Nie widzisz zawartości tablicy z System.out.println (tablica), ponieważ println dzwoni object.toString(), aby pobrać bajty z obiektu dla danych wyjściowych.

Ponieważ HashSet zastępuje domyślną implementację toString(), można zobaczyć zawartość zestawu za pomocą System.out.println (set);

jako tablice nie zastępują domyślny toString() (który daje nazwę klasy i jakieś kodu skrótu tożsamości), otrzymujesz rozmytej [Ljava.lang.String; @ 9b49e6

nadzieję, że pomoże

9

ze względu na kompletność sprawdź także java.util.Arrays.toString i java.util.Arrays.deepToString.

Ten ostatni jest szczególnie przydatny w przypadku macierzy zagnieżdżonych (takich jak Object [] []).

+0

Zgadzam się, dobrze jest nie twierdzić, że te metody mogą być bardziej wydajne niż tworzenie pośredniej listy za pośrednictwem asList(), szczególnie w przypadku dużych tablic. Zauważ, że deepToString() jest najbardziej przydatny w wielowymiarowych tablicach i złożonych zagnieżdżeniach. –

2

Jak wspomniano DFA, można po prostu wymienić:

System.out.println(array); 

z ...

System.out.println(Arrays.toString(array)); 
0

masz poprawny wynik. Niestety, metoda toString() - w tablicy jest nadal oryginalna Object.toString(), więc dane wyjściowe są w pewnym stopniu bezużyteczne, ale domyślnie dla wszystkich tablic.

Powiązane problemy