Java I';I’我试图从arraylist中删除所有素数,但什么都没有打印出来?
我是个新手,所以我为任何愚蠢的错误道歉 代码如下:Java I';I’我试图从arraylist中删除所有素数,但什么都没有打印出来?,java,arrays,Java,Arrays,我是个新手,所以我为任何愚蠢的错误道歉 代码如下: public static void keepOnlyCompositeNumbers( List<Integer> nums ){ int num=0; boolean isPrime=true; for(int i=0; i<nums.size(); i++){ num=nums.get(i); { for (int o = 2; o
public static void keepOnlyCompositeNumbers( List<Integer> nums ){
int num=0;
boolean isPrime=true;
for(int i=0; i<nums.size(); i++){
num=nums.get(i);
{
for (int o = 2; o < num; ++i)
{
if (num % o == 0){
isPrime=false;
o=2;
if(isPrime==true){
nums.remove(num);
}
}
}
}
公共静态void keepOnlyCompositeNumbers(列表nums){
int num=0;
布尔值isPrime=true;
对于(int i=0;i您可以这样使用:
public static void keepOnlyCompositeNumbers( List<Integer> nums ){
boolean isPrime=false;
for(int i=0;i<nums.size();i++){
isPrime = checkPrime(nums.get(i));
if(isPrime){
nums.remove(i);
}
System.out.println(nums);
}
boolean checkPrime(int n) {
for(int i=2;i<n;i++) {
if(n%i==0)
return false;
}
return true;
}
公共静态void keepOnlyCompositeNumbers(列表nums){
布尔isPrime=false;
对于(int i=0;i更有效的校验素数
boolean checkPrime(int n) {
for(int i=2;i<=n/2;i++) {
if(n%i==0)
return false;
}
return true;
}
布尔校验素数(int n){
对于(inti=2;i请看一看
public static void main(String[] args) throws IOException {
Integer[] nums = { 2, 6, 8, 9, 10, 12, 13, 15, 17, 24, 55, 66, 78, 77, 79 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(nums));
System.out.println("Original List => " + list);
keepOnlyCompositeNumbers(list);
System.out.println("FInal List => " + list);
}
public static void keepOnlyCompositeNumbers(List<Integer> nums) {
for (int i = 0 ; i < nums.size() ; i++) {
if (isPrime(nums.get(i))) {
nums.remove(i);
}
}
}
public static boolean isPrime(int number) {
for (int i = 2 ; i < number ; i++) {
if (number % i == 0) {
return false; // number is divisible so its not prime
}
}
return true; // number is prime now
}
publicstaticvoidmain(字符串[]args)引发IOException{
整数[]nums={2,6,8,9,10,12,13,15,17,24,55,66,78,77,79};
List List=newarraylist(Arrays.asList(nums));
System.out.println(“原始列表=>”+列表);
KeeponlyCompositeEnumber(列表);
System.out.println(“最终列表=>”+列表);
}
公共静态void keepOnlyCompositeNumbers(列表nums){
对于(int i=0;i
输出
原始列表=>[2,6,8,9,10,12,13,15,17,24,55,66,78,77,
79]
最终列表=>[6,8,9,10,12,15,24,55,66,78,77]
从Sarz的答案来看,类似这样的东西应该对CheckPrime更有效:
public static void keepOnlyCompositeNumbers( List<Integer> nums ){
boolean isPrime=false;
for(int i=0;i<nums.size();i++){
if ( checkPrime(nums.get(i), nums))
nums.remove(i);
}
boolean checkPrime(int n, List <Integer> primes) {
sqrtn = Math.sqrt(n) ;
for (Integer p : primes) {
if (p > sqrtn)
return true;
if (n % p == 0)
return false
}
}
公共静态void keepOnlyCompositeNumbers(列表nums){
布尔isPrime=false;
for(int i=0;i sqrtn)
返回true;
如果(n%p==0)
返回错误
}
}
这里有许多错误。可能还有其他错误
num=nums.get(i);
{
for (int o = 2; o < num; ++i)
{
if (num % o == 0){
isPrime=false;
o=2;
if(isPrime==true){
nums.remove(num);
}
}
}
第一次通过循环,i
是0,num
是10。假设我们决定10需要删除。因此我们删除它。列表现在是[20,30,40]。然后我们返回,将i
增加到1,并将num
设置为列表。获取(1)
——现在是30!因此我们从未查看元素20
<>有很多方法来写这个不同的东西。我不喜欢在<代码>的中间改变索引< < /Cult>循环,所以我会这样做:
int i = 0;
while (i < list.size()) {
num = list.get(i);
if (needToDelete(num)) {
list.remove(i);
} else {
i++;
}
}
inti=0;
而(i
请注意,仅当我没有从列表中删除某个元素时,我才递增I
。如果我这样做,I
将保持不变,并且现在将是下一个元素的索引,因为我删除了前面的元素。1)将布尔值isPrime=true;放入for循环内部。
1) Put boolean isPrime = true; inside for loop.
2) in for(int o = 2; o < num; ++i) // change ++i to ++o
3) comment out o=2; //o=2 and put a break;
4) put nums.remove(i); outside for loop
public static void keepOnlyCompositeNumbers(List<Integer> nums) {
int num = 0;
for (int i = 0; i < nums.size(); i++) {
boolean isPrime = true;
num = nums.get(i);
{
for (int o = 2; o < num; ++o) {
if (num % o == 0) {
isPrime = false;
// o=2;
break;
}
}
if (isPrime == true) {
nums.remove(i);
}
}
}
}
2) 在for中(into=2;o
这永远无法工作isPrime=false;num=2;if(isPrime==true){nums.remove(num);}
你用来检查素数的条件是错误的,在这里使用数组列表是愚蠢的。为了让你的生活更轻松,使用布尔数组。我对这个问题的大多数答案都感到很沮丧。提问者在他的代码中犯了一些错误,我们有机会帮助他了解他的错误,以便他可以在将来避免它们。相反,这里的大多数人都宁愿炫耀他们知道如何更好地编写代码。祝贺你。但没有帮助。“没有打印。有人能告诉我我做错了什么吗?”这并不能解释为什么OP的代码没有输出任何东西。“什么都没有打印。有人能告诉我我做错了什么吗?”这并不能解释为什么OP的代码没有输出任何东西。为什么是n/2?为什么不利用你已经积累的素数列表?如果不从2检查到n,我们可以从2检查到n/2,但为什么是n/2,当你只需要检查到sqrt(n)时?(如果pq=n,则p,q中至少有一个小于或等于n的平方根)
List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
for (int i = 0; i < list.size(); i++) {
int num = list.get(i);
if (needToDelete(num)) {
list.remove(i);
}
}
int i = 0;
while (i < list.size()) {
num = list.get(i);
if (needToDelete(num)) {
list.remove(i);
} else {
i++;
}
}
1) Put boolean isPrime = true; inside for loop.
2) in for(int o = 2; o < num; ++i) // change ++i to ++o
3) comment out o=2; //o=2 and put a break;
4) put nums.remove(i); outside for loop
public static void keepOnlyCompositeNumbers(List<Integer> nums) {
int num = 0;
for (int i = 0; i < nums.size(); i++) {
boolean isPrime = true;
num = nums.get(i);
{
for (int o = 2; o < num; ++o) {
if (num % o == 0) {
isPrime = false;
// o=2;
break;
}
}
if (isPrime == true) {
nums.remove(i);
}
}
}
}