2011-03-22 56 views
0

我目前有一個ArrayList,它包含前1000個素數。我能夠成功地將列表打印到控制檯。ArrayList中不存在Java索引<Double>

我則採用以下方法:

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指數位置,所以爲什麼會發生這種情況?索引位置隨每次運行而改變,但每次運行時都會出現錯誤。

謝謝。

+0

告訴我們在哪裏是scasol聲明 – smas 2011-03-22 18:50:51

+1

值得注意的是你的'scasol.replace()'方法沒有做任何事情,因爲它們返回了一個你沒有做任何事情的新字符串。另外,你的縮進表明你相信'scasol = x'行是else塊的一部分,但它不是。這裏的最佳做法是總是使用大括號,即使它們是可選的。 – dty 2011-03-22 19:08:07

+0

@dty感謝您的評論。我明白你的意思 - 我也懷疑'scasol.replace()'方法沒有做任何事情,但我不知道該怎麼做。我打算做的是做一個小的改變(因此方法名)到一個'String'變量,所以當遇到'1'時,它變爲'0',反之亦然。請問你會推薦什麼? – MusTheDataGuy 2011-03-22 20:29:18

回答

1

的問題是在這條線:

x = scasol.substring(0, p); 

p的值(6)要傳遞到子方法是字符串scasol太大。

0

由於p不是字符串scasol的有效索引,因此您將收到異常。你能打印出該字符串並檢查其值嗎?這是預期的價值嗎?另外,由於Java中的字符串是不可變的,因此不需要執行new String()

0

這條線:

at ScalesSolution.smallChange(ScalesSolution.java:90) 

點你,在你有例外,因此與scasol和P值此行調用的System.out.println前嘗試ScalesSolution 90線,然後你會看到什麼原因問題

0

除了GregInYEG的回答,您可以在頁碼申請模量來避免這個問題是這樣的:int p = (rand.nextInt(n) - 1) % scasol.length();

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比任何其他值都少得多。