读取字符串直到空行然后阅读更多

时间:2015-04-18 02:00:08

标签: java arrays iteration java.util.scanner

我正在编写一个程序,该程序使用Scanner读取文件中的行。当有一个空行时,我想处理已经看到并存储在String数组列表中的行。然后我希望它跳到文件中的下一行,直到它再次看到一个空行..然后处理这些行,直到文件被完全读取。

我似乎无法绕过这样做?到目前为止,我的程序适用于一组行,直到它到达空白行,但后来没有进展。

while scan.hasnextLine()循环结束后,我可以在我的代码中看到我想要做的处理。

感谢您的帮助。

public static void main(String[]argv){
    Scanner scan = new Scanner(System.in);
    //read in the line from stdin, if it's empty, then break out OR process it
    while (scan.hasNextLine()){
        String tempLine = scan.nextLine();
        if (tempLine.equals("")){
            break;
        }        
        columnCount = tempLine.length();
        tempArray.add(tempLine); //add temp line to string array initial

        rowCount++;
    }
    System.out.println("rowcount: "+rowCount);
    System.out.println("columnCount: "+columnCount);

    //set the 2D array to the right size
    epidemicArray = new char[rowCount][columnCount];

    //populate 2d array with strings from tempArray
    updateArray();
    System.out.println("original array:");
    printArray();

    //copy populated 2d array to another array
    copyArray(epidemicArrayCopy);


    //iterate over array to get final state
    do{
        getFinalState(epidemicArray);
    } while (countChanges > 0);
    printArray();

}

3 个答案:

答案 0 :(得分:1)

我认为这会奏效。

public static void main(String[]argv){
    Scanner scan = new Scanner(System.in);
    //read in the line from stdin, if it's empty, then break out OR process it

    while (readSome(scan)){}
}

public void readSome(Scanner scan) {
    while (true){
        if (!scan.hasNextLine()) {
            return false;
        }
        String tempLine = scan.nextLine();
        if (tempLine.equals("")){
            break;
        }
        columnCount = tempLine.length();
        tempArray.add(tempLine); //add temp line to string array initial

        rowCount++;
    }
    System.out.println("rowcount: "+rowCount);
    System.out.println("columnCount: "+columnCount);

    //set the 2D array to the right size
    epidemicArray = new char[rowCount][columnCount];

    //populate 2d array with strings from tempArray
    updateArray();
    System.out.println("original array:");
    printArray();

    //copy populated 2d array to another array
    copyArray(epidemicArrayCopy);


    //iterate over array to get final state
    do{
        getFinalState(epidemicArray);
    } while (countChanges > 0);
    printArray();

    return true;
}

这里我们对每个块读取进行处理。

修改 我怀疑你需要添加:

columnCount = 0;
rowCount = 0;

到readSome方法的开头。

<强>最终修改

修改2

你可能也需要这个:

tempArray = new ArrayList<String>();

在列/行计数附近重置。

结束编辑2

或许你想要:

public static void main(String[]argv){
    Scanner scan = new Scanner(System.in);
    //read in the line from stdin, if it's empty, then break out OR process it
    while (scan.hasNextLine()){
        String tempLine = scan.nextLine();
        if (tempLine.equals("")){
            continue;
        }
        columnCount = tempLine.length();
        tempArray.add(tempLine); //add temp line to string array initial

        rowCount++;
    }
    System.out.println("rowcount: "+rowCount);
    System.out.println("columnCount: "+columnCount);

    //set the 2D array to the right size
    epidemicArray = new char[rowCount][columnCount];

    //populate 2d array with strings from tempArray
    updateArray();
    System.out.println("original array:");
    printArray();

    //copy populated 2d array to another array
    copyArray(epidemicArrayCopy);


    //iterate over array to get final state
    do{
        getFinalState(epidemicArray);
    } while (countChanges > 0);
    printArray();

}

这里的区别在于我们继续,而不是打破,所以我们阅读其余的部分。但是我们只在阅读完整个文件后进行处理。

答案 1 :(得分:1)

以下是您的问题发生的地方:

if (tempLine.equals("")){
    break;
}        

当你到达break时,你退出循环。创建一个名为processArraySoFar的函数,然后调用该函数而不是break。假设tempArrayArrayList

if(tempLine.equals("")){
    processArraySoFar(tempArray);
    tempArray = new ArrayList(); //make a fresh ArrayList to use until the next line
}

答案 2 :(得分:1)

你遇到的问题是你正在使用break摆脱循环而你真正想要的是跳过这一行并继续。

所以你基本上所要做的就是删除中断并改变你的代码以使其类似于:

String tempLine = scan.nextLine();
if (!tempLine.equals("")){
    columnCount = tempLine.length();
    tempArray.add(tempLine); //add temp line to string array initial

    rowCount++;
}