Индекс Java не существует в ArrayList <Double> - PullRequest
0 голосов
/ 22 марта 2011

В настоящее время у меня есть 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 class:

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 ]

1 голос
/ 22 марта 2011

Проблема в этой строке:

x = scasol.substring(0, p);

Значение p (6), которое вы передаете методу подстроки, слишком велико для строки scasol.

0 голосов
/ 22 марта 2011

Возможно, проблема возникает из-за того, что вы закрывали scasol при каждом вызове smallChange.

Линии

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 встречается гораздо реже, чем любое другое значение.

0 голосов
/ 22 марта 2011

В дополнение к ответу GregInYEG вы можете применить модуль к p, чтобы избежать этой проблемы следующим образом: int p = (rand.nextInt(n) - 1) % scasol.length();

0 голосов
/ 22 марта 2011

Эта строка:

at ScalesSolution.smallChange(ScalesSolution.java:90)

указывает, что в 90 строке в ScalesSolution у вас есть исключение, поэтому попробуйте перед этой строкой вызвать System.out.println со значением scasol и p, и вы увидите, чтовызвать проблему

0 голосов
/ 22 марта 2011

Вы получаете исключение, потому что p не является допустимым индексом для строки scasol.Можете ли вы распечатать эту строку и проверить ее значение?Это ожидаемое значение?Кроме того, нет необходимости делать new String(), поскольку строки в Java являются неизменяемыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...