2015-11-08 18 views
6

回顧java集合框架的java api,我在HashSet中找不到toArray()方法,在抽象類Set中有toArray()方法。如何將哈希值轉換爲使用toArray()的數組如果未指定方法toArray?

class Ideone { 
    public static void main (String[] args) throws java.lang.Exception { 
     Set x = new HashSet(); 
     x.add(4); 
     //ArrayList<Integer> y = x.toArray(); this does not work ! 
     int[] y = x.toArray();//this does not work! 

     System.out.println(x.toArray());//this gives some weird stuff printed : Ljava.lang.Object;@106d69c 
    } 
} 

如何將hashset轉換爲數組,如果沒有指定toArray()?

+3

好吧,toArray返回一個'Object []',只是打印出來,如果toString沒有被正確覆蓋,那麼就會給你典型的java輸出。並且'Object []'不能隱式轉換爲'int []'。 – luk2302

+0

@ luk2302正好。這是我在答案中寫的,但是它的評價很低。我不確定問題的答案是什麼。任何人都可以解釋,以便我可以改進 –

+0

@MSach可能是因爲你只解釋打印輸出,而不是爲什麼第一行不行,也不是正確的方式 - 但這當然只是一個猜測 – luk2302

回答

19

當然HashSet實施toArray。它必須實現它,因爲它實現了指定此方法的Set接口。實際執行的是AbstractCollection,這是AbstractSet的超類,它是HashSet的超類。

首先,你不應該使用原始類型。

用途:

Set<Integer> x = new HashSet<>(); 
x.add(4); 

然後轉換爲數組:

Integer[] arr = x.toArray(new Integer[x.size()]); 

使用x.toArray()會給你一個Object[]

+0

是的,我只注意到你可以將字符串,int,char等添加到未指定的hashSet! – ERJAN

+1

@ERJAN是的,這是因爲它使用Object類,並且這些原語的盒裝版本擴展了Object。 – SamTebbs33

2

確保您申報的一般爲HashSet

Set<Integer> x = new HashSet<>(); 

並將其轉換爲一個數組,像這樣:

int[] y = new int[x.size()]; 
int c = 0; 
for(int x : x) y[c++] = x; 
1

一線

ArrayList的Y = x.toArray();這不起作用!

首先,您使用Set x = new HashSet();即原始類型。編譯器不知道那正是它也會包含整數對象,但對左側上面一行你說的它的將是整數,其中實際上它的數組

二線

的int數組列表[] y = x.toArray(); //這不起作用!

與左手側上方行你說的它的將是整數的數組,其中實際上其對象的數組

這將工作

Object[] y = x.toArray(); 

但這不是正確的方式 。你不應該使用原始類型

Set<Integer> x = new HashSet<>(); 
Integer[] intArray= x.toArray(new Integer[x.size()]); 

的System.out.println(x.toArray()); //這給了一些奇怪的東西打印 :Ljava.lang。Object; @ 106d69c

它的印刷toString表示數組對象。這就是爲什麼你看到它作爲Ljava.lang.Object;@106d69c

如果你想打印每個元素,遍歷它,然後打印它。

+0

Downvoter這將有助於瞭解最新的錯誤嗎?我沒有得到什麼問題在答案 –

+0

我upvoted你回來給予更好的回答 – ERJAN

2

它看起來像你最初想創建一個ArrayList而不是一個簡單的數組。所以,試試這個!

class Ideone 
{ 
     public static void main (String[] args) throws java.lang.Exception 
     { 
      Set x = new HashSet(); 
      x.add(4); 
      ArrayList<Integer> y = ArrayList<Integer>(x); 
      System.out.println(y); 
     } 
} 
+0

調整讀取:new ArrayList – rothschild86

0

比較JDK 7排序小地圖,使用TreeSetArrayListArray

long start = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
    TreeSet a = new TreeSet(payloads.keySet());       
} 
System.out.println("TreeSet: " + (System.currentTimeMillis()-start) + " ms."); 
start  = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
    ArrayList a = new ArrayList(payloads.keySet()); 
    Collections.sort(a);  
} 
System.out.println("ArrayList: " + (System.currentTimeMillis()-start) + " ms."); 
start  = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
    String[] a = payloads.keySet().toArray(new String[payloads.size()]); 
    Arrays.sort(a);  
} 
System.out.println("Array: " + (System.currentTimeMillis()-start) + " ms."); 

收率:

TreeSet中:1527毫秒。
ArrayList:943ms。
陣列:485毫秒。

相關問題