如果未指定方法toArray,如何使用toArray()将hash Set转换为数组?

问题描述 投票:14回答:6

看一下java api for java collections framework,我在HashSet中找不到toArray()方法,抽象类Set中有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
    }
}

如果没有指定toArray(),如何将hashset转换为数组?

java collections hashset
6个回答
32
投票

当然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[]


4
投票

确保声明HashSet的泛型

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

并将其转换为如下数组:

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

2
投票

第一行

ArrayList y = x.toArray();这不起作用!

首先你使用Set x = new HashSet();,即原始类型。编译器不知道它将包含整数对象但是在左侧的上面的行你说它将是整数的arraylist其中它实际上是一个数组

第二行

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

如果要打印每个元素,请迭代它然后打印它。


2
投票

看起来你最初想要创建一个ArrayList而不是一个简单的Array。所以,试试吧!

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
投票

在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:943毫秒。 阵列:485毫秒。


0
投票

我们可以遍历循环并将值存储到数组中。

int[] answer = new int[set1.size()];
int i = 0;
for (int num : set1) {
      answer[i++] = num;
}
© www.soinside.com 2019 - 2024. All rights reserved.