首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子字符串- StringIndexOutOfBounds异常java

子字符串- StringIndexOutOfBounds异常java
EN

Stack Overflow用户
提问于 2013-11-05 01:30:19
回答 3查看 455关注 0票数 0

我一直在编写一个程序,从文件中收集数据并对其做一些处理(如代码和伪代码所示),但是我很难将字符串的每个元素放入正确的数组中。文件中的一行如下所示:

代码语言:javascript
复制
1980 Aug    945 100 Allen

我想使用子字符串方法,因为在我看来这是最简单的方法。有没有更好的方法呢?到目前为止,这是我的代码。问题到底出在哪里,我该如何解决它?谢谢!:)

代码语言:javascript
复制
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);
}
}
EN

回答 3

Stack Overflow用户

发布于 2013-11-05 01:38:14

您可能会这样做:

代码语言:javascript
复制
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);
        }




        }

不兼容类型的问题是因为您必须将Scanner对象转换为字符串。我在while循环中这样做了,所以现在虽然扫描器有下一行,但它会将该行转换为字符串,并在空格上拆分它。您将拥有一个包含所有值的数组。现在,您可以根据数组中的位置执行逻辑。

票数 0
EN

Stack Overflow用户

发布于 2013-11-05 01:38:50

您可以使用regex将字符串拆分为数组:

代码语言:javascript
复制
    String s = "1980 Aug    945 100 Allen";
    Pattern p = Pattern.compile("\\s+");
    System.out.println(Arrays.toString(p.split(s)));

或者使用String.split方法:

代码语言:javascript
复制
    System.out.println(Arrays.toString(s.split("\\s+")));

输出:

代码语言:javascript
复制
[1980, Aug, 945, 100, Allen]
[1980, Aug, 945, 100, Allen]
票数 0
EN

Stack Overflow用户

发布于 2013-11-05 02:20:47

问题的标题列出了索引越界异常,但没有说明它是StringIndexOutOfBoundsException还是ArrayIndexOutOfBoundsException。

将行读入定义为容纳1000个元素的数组中,然后将解析后的字符串片段放入仅定义为容纳64个元素的数组中。

可能是你的解析逻辑没问题,但是数组被填满了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19773516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档