2013-11-04 25 views
0

我一直在研究一個程序來收集文件中的數據,並做一些東西(如代碼和僞代碼中所示),但是我很難將字符串的每個元素正確的數組。從文件中的行看起來是這樣的:Substring - StringIndexOutOfBounds異常java

1980 Aug 945 100 Allen 

我想使用的子方法,因爲那會是我認爲最簡單的。有沒有更好的方法來做到這一點?這是我的代碼到目前爲止。問題的確切位置在哪裏,我該如何解決?謝謝! :)

import java.util.Scanner; 
import java.io.File; 
import java.io.IOException; 
import java.lang.String; 
public class Hurricanes2 
{ 

public static void main(String [] args) throws IOException 
{ 
int counter = 0; 
String [] token = new String[1000]; 

String [] tokenElements = new String[128]; 
String [] hurricaneYear = new String[64]; 
String [] hurricaneName = new String[64]; 
String [] hurricaneMonth = new String[64]; 
int [] hurricaneCategory = new int[64]; 
double [] hurricanePressure = new double[64]; 
double tempKnots; 
double knotsToMph; 
double [] hurricaneWindSpeed = new double[64]; 
double categoryAverage; 
double pressureAverage; 
double speedAverage; 
String headerData = "       Hurricanes 1980 - 2006\n\n Year   Hurricane  Category  Pressure(MB)  Wind Speed  (MPH)\n========================================================================"; 
Scanner in = new Scanner(System.in); 
Scanner inFile = new Scanner(new File("hurcData2.txt")); 
System.out.println(headerData); 

/**---Use for-each (line:token) 
* Parse for year - > year array 
* parse for name - > name array 
* parse for knots - > tempKnots 
* knotsToMph = tempKnots * 1.15078 
* hurricaneWindSpeed[counter] = knotsToMph 
* enter if-else to calculate category (hurricaneCategory [] = 1,2,3,4, or 5): 
*  74-95 cat1 
*  96-110 cat2 
*  111 - 129 cat3 
*  130-156 cat4 
*  157 or higher cat 5 
* 
* 
*/ 
while(inFile.hasNextLine()){ 

     token[counter] = inFile.nextLine(); 
     String tempToken = token[counter]; 
     hurricaneYear[counter] = tempToken.substring(0, 3); 
     hurricaneMonth[counter] = tempToken.substring(6, 8); 
     hurricanePressure[counter] = Double.parseDouble(tempToken.substring(10, 12)); 
     hurricaneWindSpeed[counter] = Double.parseDouble(tempToken.substring(14, 16)); 
     hurricaneName[counter] = tempToken.substring(17); 


     counter++; 


    } 
System.out.print("Lines: " + counter); 
} 
} 
+0

使用oString.split(「」)返回一個信息數組(跳過空格) – wxyz

+0

這很有趣,因爲我只是擺脫了那一行,因爲我認爲substring方法會更好。哈!謝謝。 – OrangeCalx01

回答

0

你也許可以做這樣的事情:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 







public class test { 

    public void converter(String[] stringArray) { 


     int counter = 0; 
     String [] token = new String[1000]; 
     String [] tokenElements = new String[128]; 
     String [] hurricaneYear = new String[64]; 
     String [] hurricaneName = new String[64]; 
     String [] hurricaneMonth = new String[64]; 
     int [] hurricaneCategory = new int[64]; 
     double [] hurricanePressure = new double[64]; 
     double tempKnots; 
     double knotsToMph; 
     double [] hurricaneWindSpeed = new double[64]; 
     double categoryAverage; 
     double pressureAverage; 
     double speedAverage; 
     String headerData = "       Hurricanes 1980 - 2006\n\n Year   Hurricane  Category  Pressure(MB)  Wind Speed  (MPH)\n========================================================================"; 
     Scanner in = new Scanner(System.in); 
     Scanner inFile = null; 
     try { 
      inFile = new Scanner(new File("hurcData2.txt")); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



     while(inFile.hasNextLine()){ 

      String line = inFile.nextLine(); 
      String[] arrayOfString = line.split(" "); 




      } 
     System.out.print("Lines: " + counter); 
     } 




     } 

問題不兼容的類型,因爲你必須掃描儀對象轉換爲字符串。我在while循環中做了這些,所以現在,當掃描器有下一行時,它會將該行變成一個字符串並將其分割到空格中。你將有一個數組的所有值。現在,您可以根據陣列中的位置執行邏輯。

+0

這會產生不兼容的類型。 – OrangeCalx01

+0

@ OrangeCalx01你必須使用inFile.nextline()將行分割成一個字符串,然後再分割它。讓我知道如果你有更多的錯誤? –

+0

它已經在循環的開始。 – OrangeCalx01

0

可以與正則表達式的字符串分割成數組:

String s = "1980 Aug 945 100 Allen"; 
    Pattern p = Pattern.compile("\\s+"); 
    System.out.println(Arrays.toString(p.split(s))); 

或使用String.split方法:

System.out.println(Arrays.toString(s.split("\\s+"))); 

輸出:

[1980, Aug, 945, 100, Allen] 
[1980, Aug, 945, 100, Allen] 
0

問題的標題列出索引越界異常,但它不會說是否是StringIndexOutOfBoundsException或ArrayIndexOutOfBoundsEx ception。

您將行讀入定義爲包含1000個元素的數組中,但將字符串的分析部分放入只包含64個元素的數組中。

這可能是因爲你的解析邏輯正常,但數組正在越過填充。