Java 8 中的质数

新手上路,请多包涵

我试图用 Java 8 编写一个简单的素数程序。下面是程序。我也想减少 isPrime() 中的代码。 Is there something that filters the elements from 2 to n/2 , and then apply filter for n%i == 0 which would make isPrime ?

 import static java.util.stream.Collectors.toList;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Stream1 {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 20);
        // Prime number
        System.out.println(numbers.stream()
                             .filter(Stream1::isPrime)
                             .collect(toList()));
    }

    public static boolean isPrime(int number) {
        for (int i = 2; i <= number / 2; i++) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }
}

原文由 user3310115 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 509
2 个回答

IntStream 可用于生成整数流

public static boolean isPrime(int number) {
    return !IntStream.rangeClosed(2, number/2).anyMatch(i -> number%i == 0);
}

或者

public static boolean isPrime(int number) {
    return IntStream.rangeClosed(2, number/2).noneMatch(i -> number%i == 0);
}

原文由 Shashwat Kumar 发布,翻译遵循 CC BY-SA 3.0 许可协议

您的 isPrime() 效率低下。首先,您不需要除以任何大于 2 的偶数,因为初始除以 2 将捕获所有偶数非素数。其次,您在 number / 2 而不是更高效的 sqrt(number) 终止循环。

您可以像这样重写您的方法:

 public static boolean isPrime(int number) {

    // Even numbers
    if (number % 2 == 0) {
        return number == 2;
    }

    // Odd numbers
    int limit = (int)(0.1 + Math.sqrt(number));
    for (int i = 3; i <= limit; i += 2) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
}

Eratosthenes 筛法的效率会更高,但对于相对较小的问题来说,这可能有点矫枉过正。

原文由 rossum 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题