2017-05-20 22 views
0

hotelListに5つ以上の値を指定して以下のコードを実行しようとすると、次のエラーが発生します。私はペナルティとパスを反復する方法にはエラーがあると思うが、それを修正する方法は不明だ。スレッド "メイン" java.lang.ArrayIndexOutOfBoundsExceptionでforループ内のリストに値を追加するとエラーが発生する

例外:5 First.mainで (First.java:81)

import java.util.*; 
import java.io.*; 

class First { 


    public static void printPath(int path[], int i) { 
     if (i == 0) return; 
     printPath(path, path[i]); 
     System.out.print(i + " "); 
    } 


    public static void main(String[] args) throws FileNotFoundException, java.io.IOException { 

     Scanner dataFile = new Scanner(new File("C:\\Users\\USER\\Documents\\Data.txt")); 
     ArrayList<Integer> hotels = new ArrayList<>(); 
     hotels.add(0); 
     while (dataFile.hasNextLine()) { 
      hotels.add(dataFile.nextInt()); 
     } 
     dataFile.close(); 
     //optimalStops(hotels); 


     //int[] hotelList = new int[hotels.size()]; 

     /*for (int i = 0; i < hotels.size(); i++) { 
      if (hotels.get(i) != null) { 
       hotelList[i] = hotels.get(i); 
      }*/ 

      int hotelList[] = {0, 66, 83, 130, 180, 1}; 
      int penalties[] = {0, (int) Math.pow(200 - hotelList[1], 2), -1, -1, -1}; 
      int path[] = {0, 0, -1, -1, -1}; 
      for (int i = 2; i <= hotelList.length - 1; i++) { 
       for (int j = 0; j < i; j++) { 
        int tempPen = (int) (penalties[j] + Math.pow(200 - (hotelList[i] - hotelList[j]), 2)); 
        if (penalties[i] == -1 || tempPen < penalties[i]) { 
         penalties[i] = tempPen; 
         path[i] = j; 
        } 
       } 
      } 
      for (int i = 1; i < hotelList.length; i++) { 
       System.out.print("Hotel: " + hotelList[i] + ", penalty: " + penalties[i] + ", path: "); 
       printPath(path, i); 
       System.out.println(); 
      } 
+0

あなたが 'penalties [j]'と言うとき、 'j'が' penalties'の長さより大きい場合、あなたが記述するエラーが発生します。 'i'が' hotelList.length'よりも小さいかどうかをチェックしていることに注意してください(ただし、 'penalties'と' path'も同様にインデックスに使用します)。そして 'hotelList'は' 6'要素を持っています... –

答えて

0

あなたの罰則はわずか5項目の長さです。だからあなたはこれを呼び出します:

for (int i = 1; i < hotelList.length; i++) { 
    System.out.print("Hotel: " + hotelList[i] + ", penalty: " + penalties[i] + ", path: "); 

あなたは境界外のエラーをスローするペナルティ[5]にアクセスしようとしています。

for (int i = 1; i < hotelList.length; i++) { 
    for(int j = 0; j < penalties.length; j++){ 
     System.out.print("Hotel: " + hotelList[i] + ", penalty: " + penalties[j] + ", path: "); 

私が言うことができない:私はあなたの意図がもっとこのような何かをすることだと思います

for (int i = 2; i <= hotelList.length - 1; i++) { 
    for (int j = 0; j < i; j++) { 
    int tempPen = (int) (penalties[j] + Math.pow(200 - (hotelList[i] - hotelList[j]), 2)); 
    if (penalties[i] == -1 || tempPen < penalties[i]) { 
     penalties[i] = tempPen; 
     path[i] = j; 
    } 
} 

はまた、コードのこの部分では同じ問題を抱えていますあなたの意図はもう一方のループにあるのですか?あなたが達成しようとしていることを説明できるなら、私は助けることができるかもしれません。

+0

私は助けに感謝します。基本的には、100マーカーのarraylistの問題を解決するための再帰的なメソッドを記述しようとしています。今はただ再帰なしで問題を解決しようとしていますが、ループエラーが発生しています。この問題を正しい方法で解決しようとしていますか? – Jon

+0

あなたは長い旅行をしています。あなたはマイルポスト0で道路をスタートします。道に沿って、マイルのポストa1 Jon

+0

1日中にxマイルを移動する場合、その日のペナルティは(200 - x)^ 2です。毎日のペナルティの合計旅行日数の合計であるペナルティを最小限に抑えるように旅行を計画したいと考えています。停止するホテルの最適な順序を決定する効率的なアルゴリズムを与えます。 – Jon

関連する問題