获取Map的键数组

12

我正在尝试以Python为基础学习Java,所以请容忍我的错误。

我正在实现一个埃拉托色尼筛法的方法(我已经有了一个Python版本,现在尝试将其转换为Java):

def prevPrimes(n):
    """Generates a list of primes up to 'n'"""
    primes_dict = {i : True for i in range(3, n + 1, 2)}
    for i in primes_dict:
        if primes_dict[i]:
            num = i
        while (num * i <= n):
            primes_dict[num*i] = False
            num += 2
    primes_dict[2] = True
    return [num for num in primes_dict if primes_dict[num]]

这是我尝试将其转换为 Java 的结果:

import java.util.*;
public class Sieve {
    public static void sieve(int n){
        System.out.println(n);
        Map primes = new HashMap();
        for(int x = 0; x < n+1; x++){
            primes.put(x, true);
        }
        Set primeKeys = primes.keySet();
        int[] keys = toArray(primeKeys);  // attempt to convert the set to an array
        System.out.println(primesKeys); // the conversion does not work
        for(int x: keys){
            System.out.println(x);
        }
        // still have more to add
        System.out.println(primes);
    }
}

我遇到的错误是找不到方法toArray(java.util.Set)。我该怎么修复?

3个回答

43

首先,使用泛型:


Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
Set<Integer> keys = map.keySet();

其次,要将集合转换为数组,您可以使用toArray(T[] a)方法:

Integer[] array = keys.toArray(new Integer[keys.size()]);

如果您想使用int而不是Integer,则需要对每个元素进行迭代:

int[] array = new int[keys.size()];
int index = 0;
for(Integer element : keys) array[index++] = element.intValue();

我建议将 for(Integer element : keys) array[index++] = element.intValue(); 替换为 for(Integer element : keys) array[index++] = element,以消除装箱操作。这个小技巧帮助我挽救了程序员的生命。 - Stavro Xhardha

3

请使用 primeKeys.toArray() 替代 toArray(primeKeys)


1
int[] keys = primeKeys.toArray() 高亮显示括号并出现错误:不兼容的类型 - Rushy Panchal

2

toArray()Collection 类的成员方法,所以只需使用 Collection.toArray(...) 并导入 java.util.Collection;

注意: toArray() 返回一个 Object[],所以你需要将其转换为 Integer[] 并将其分配给一个 Integer[] 引用:

Integer[] array = (Integer[])Collection.toArray( someCollection );

感谢自动装箱,整数现在大部分时间都像int一样工作。
编辑:dan04的解决方案非常酷,希望我能想到那个...无论如何,您仍然需要将其强制转换并分配给Object []类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接