ArrayList <double> </double>中不存在Java索引

时间:2011-03-22 18:47:09

标签: java indexing

我目前有一个ArrayList,它包含前1000个素数。我能够成功地将列表打印到控制台。

然后我应用以下方法:

public static ScalesSolution RMHC(ArrayList<Double> weights, int n, int iter){

    private String scasol;

    ScalesSolution sol = new ScalesSolution(n);

    for(int i = 1; i <= iter; i++){

        double oldsol = sol.ScalesFitness(weights);

        sol.smallChange(n);
        sol.println();

        double newsol = sol.ScalesFitness(weights);

        if(newsol > oldsol){
            newsol = oldsol;
        }
    }
    return(sol);
}

主要方法:

public static void main(String[] args){

    ArrayList<Double> primes = new ArrayList<Double>();

    primes.addAll(CS2004.ReadNumberFile("1000 Primes.txt"));

    RMHC(primes, 10, 50);

}

ScalesSolution类:

public class ScalesSolution{

public void smallChange(int n)
{
    Random rand = new Random();
    int p = (rand.nextInt(n) - 1);

    //Checks if p < 0.  If so, then p will not have 1 subtracted from it.
    if(p < 0){
        p = (rand.nextInt(n));
    }

    String x = new String();

    x = scasol.substring(0, p);

        if (scasol.charAt(p) == '0')
            scasol.replace('0', '1');
        else if (scasol.charAt(p) == '1')
            scasol.replace('1', '0');
            scasol = x;
}//End smallChange()

}

然而,每当我调用该方法时,无论我为参数输入什么,都会收到以下错误。 (仅供参考,ArrayList<Double> weights是素数列表,int n是要查找的解的大小,iter是算法将运行的迭代次数。)

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.substring(Unknown Source)
at ScalesSolution.smallChange(ScalesSolution.java:90)
at Lab8.RMHC(Lab8.java:15)
at Lab8.main(Lab8.java:46)

如上所述,该列表包含1000个元素(1000 - 1个索引),但我总是收到上述错误。

正如您所看到的,它指向索引位置6处的错误,但有1000 - 1个索引位置,为什么会发生这种情况?索引位置随每次运行而变化,但每次运行时都会出现错误。

谢谢。

5 个答案:

答案 0 :(得分:1)

问题在于这一行:

x = scasol.substring(0, p);

传递给substring方法的p(6)的值对于字符串scasol来说太大了。

答案 1 :(得分:0)

您收到异常,因为p不是字符串scasol的有效索引。你能打印出那个String并检查它的值吗?这是预期的价值吗?此外,不需要new String()作为Java中的字符串是不可变的。

答案 2 :(得分:0)

这一行:

at ScalesSolution.smallChange(ScalesSolution.java:90)

指出你在ScalesSolution的90行中你有Exception,所以在这行之前尝试使用scasol和p值调用System.out.println,然后你会看到导致问题的原因

答案 3 :(得分:0)

除了GregInYEG的答案,你可以在p上应用模数来避免这样的问题:int p = (rand.nextInt(n) - 1) % scasol.length();

答案 4 :(得分:0)

问题可能是因为你在每次调用smallChange时都缩短了scasol。

String x = new String();
x = scasol.substring(0, p);

if (scasol.charAt(p) == '0')
    scasol.replace('0', '1');
else if (scasol.charAt(p) == '1')
    scasol.replace('1', '0');

scasol = x;

在功能上等同于

scasol = scasol.substring(0, p);

因此切断你的字符串scasol缩短为p字符,并且可能不足以支持for循环中的第二次调用。

我认为这些线路实际上应该做些不同的事情吗?你能描述一下这种方法的预期功能吗?

也是行

Random rand = new Random();
int p = (rand.nextInt(n) - 1);

//Checks if p < 0.  If so, then p will not have 1 subtracted from it.
if(p < 0){
    p = (rand.nextInt(n));
}
看起来很奇怪。你想在这里完成什么?它的作用是得到0到n-1之间的随机数,而n-1比任何其他值都少得多。