Java 为什么我的数列素数枚举程序会返回意外值?
给定一个从最小值到最大值的整数列表,我试图找到素数因子列表,这些素数因子均匀地乘以先前给定列表中的任何整数 例如,给定整数的输入列表Java 为什么我的数列素数枚举程序会返回意外值?,java,arrays,list,debugging,arraylist,Java,Arrays,List,Debugging,Arraylist,给定一个从最小值到最大值的整数列表,我试图找到素数因子列表,这些素数因子均匀地乘以先前给定列表中的任何整数 例如,给定整数的输入列表[1…10],程序将输出[1,2,2,3,3,5,7]。此列表包含列表的主要因素,因为1*1=1,1*2=2,1*3=3,2*2=4,5*1=5,2*3=6,1*7=7,2*2=8,3*3=9,2*5=10 无论如何,为了做到这一点,我创建了一个方法(在Java中)来枚举从最小值到最大值的所有整数。从那里,我创建了一个方法来查找任何给定整数的素数因子。使用这个素数因
[1…10]
,程序将输出[1,2,2,3,3,5,7]
。此列表包含列表的主要因素,因为1*1=1
,1*2=2
,1*3=3
,2*2=4
,5*1=5
,2*3=6
,1*7=7
,2*2=8
,3*3=9
,2*5=10
无论如何,为了做到这一点,我创建了一个方法(在Java中)来枚举从最小值到最大值的所有整数。从那里,我创建了一个方法来查找任何给定整数的素数因子。使用这个素数因子方法,我编写了一个方法来遍历一个整数列表,保留这些整数所需的素数因子的运行列表,而不添加任何不在该列表中的额外项。例如,如果只需要2和8的素因子,它将找到8(2,2和2)的素因子和4(2和2)的素因子。然而,由于2和2已经在列表中,因为8的主要因素,它们不会被添加。当然,程序中还有其他助手方法可能存在bug,但这是它的主要结构
我在列表[1…10]
上测试了这个程序,期望得到输出[2,2,2,3,3,5,7]
,但得到的是输出[3,3,7]
。似乎出于某种原因,当我取整数列表和运行列表中某个数字的素数因子的相对补码时,运行列表中的一些数字被删除了,但我不明白为什么
有人能找到这个bug并告诉我为什么会发生这种情况吗
代码:
import java.io.*;
导入java.util.*;
导入java.lang.Math;
班长{
公共静态void main(字符串[]args){
系统输出println(listPrimeFactors(maxToMin(1,10));
}
公共静态ArrayList PrimeFactors(ArrayList myList){
ArrayList myFactors=新的ArrayList();
对于(int j=0;j>>”+模板列表1);
返回模板1;
}
私有静态布尔inList(int n,ArrayList myList){
对于(int k=0;k=min;i--){
添加(i);
}
返回myList;
}
}
在没有迭代器的情况下循环列表时,不应从列表中删除项目,请参见此。
此外,您将继续使用临时列表(其中的元素已被删除),而不是运行列表
以下是这些更改的示例:
private static ArrayList<Integer> addDifference(ArrayList<Integer> list1, ArrayList<Integer> list2){
ArrayList<Integer> tempList1 = new ArrayList<>(list1);
for (Iterator<Integer> iterator = list2.iterator(); iterator.hasNext();) {
Integer value = iterator.next();
if (inList(value, tempList1)) {
iterator.remove();
tempList1.remove(value);
}
}
for (int r = 0; r < list2.size(); r++){
list1.add(list2.get(r));
}
System.out.println(list2 + " >>> " + list1);
return list1;
}
私有静态ArrayList addDifference(ArrayList列表1、ArrayList列表2){
ArrayList tempList1=新的ArrayList(列表1);
for(Iterator Iterator=list2.Iterator();Iterator.hasNext();){
整数值=迭代器.next();
if(inList(值,templast1)){
iterator.remove();
模板1.删除(值);
}
}
对于(int r=0;r>>”+list1);
返回列表1;
}
private static ArrayList<Integer> addDifference(ArrayList<Integer> list1, ArrayList<Integer> list2){
ArrayList<Integer> tempList1 = new ArrayList<>(list1);
for (Iterator<Integer> iterator = list2.iterator(); iterator.hasNext();) {
Integer value = iterator.next();
if (inList(value, tempList1)) {
iterator.remove();
tempList1.remove(value);
}
}
for (int r = 0; r < list2.size(); r++){
list1.add(list2.get(r));
}
System.out.println(list2 + " >>> " + list1);
return list1;
}