java 如果没有指定toArray方法,如何使用toArray()将哈希集转换为数组?

mw3dktmi  于 2022-12-21  发布在  Java
关注(0)|答案(7)|浏览(179)

查看java集合框架的java API,我在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转换为数组?

gmxoilav

gmxoilav1#

当然HashSet实现了toArray。它必须实现它,因为它实现了Set接口,该接口指定了此方法。实际实现在AbstractCollection中,AbstractCollectionAbstractSet的超类,AbstractSetHashSet的超类。
首先,不应该使用原始类型。
用途:

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

然后转换为数组:

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

使用x.toArray()会得到一个Object[]

q5lcpyga

q5lcpyga2#

确保为HashSet声明泛型

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

并将其转换为如下数组:

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

0pizxfdo3#

第一行

数组列表y = x.到数组();这是行不通的!
首先你使用了Set x = new HashSet();,也就是原始类型,编译器不知道它会包含整型对象,但是在左手的上面一行,你说它会是整型的数组列表,而实际上它是一个数组

第二行

整数[] y = x.到数组();//这不起作用!
上面一行在左手,你说它是整型数组,而实际上它是对象数组

这样就行了

Object[] y = x.toArray();

但这不是正确的方法,您不应该使用原始类型

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

系统输出打印入(x.toArray());//打印出一些奇怪的东西:语言对象; @106d69c时
它打印数组对象的字符串表示,这就是为什么你会看到它是Ljava.lang.Object;@106d69c
如果要打印每个元素,请遍历它,然后打印它。

esbemjvw

esbemjvw4#

看起来你最初想创建一个数组列表而不是一个简单的数组。所以,试试这个!

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

eqqqjvef5#

JDK 7中使用TreeSetArrayListArray对小Map进行排序的比较:

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.");

产量:
树集:1527毫秒。
数组列表:943毫秒。
阵列:485 ms。

ahy6op9u

ahy6op9u6#

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

int[] answer = new int[set1.size()];
int i = 0;
for (int num : set1) {
      answer[i++] = num;
}
wlwcrazw

wlwcrazw7#

你可以把一个hashset转换成arraylist然后再转换成arrays int[].如果你想动态地把它转换回array,这个方法是很好的.
这将是一种一步到位的解决方案。

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

int[] result = new ArrayList<>(my_set).stream().mapToInt(i -> i).toArray();
System.out.println(Arrays.toString(result)); // [4]

相关问题