【问题标题】:Not printing the right output - Arrays and Strings - Java没有打印正确的输出 - 数组和字符串 - Java
【发布时间】:2013-11-01 15:51:17
【问题描述】:

虽然我已经解决了我之前遇到的 split() 问题(感谢最后一个帮助我的人!)我还有另一个问题。这在此处列出的代码中很明显,但是我不知道它是什么。问题是它只将文件的最后一行打印到输出中,而在这个阶段,我希望它打印出所有行。我需要解决什么问题?谢谢!!

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 [] hurrcaneYear = new String[64];
String [] hurrcaneName = new String[64];
int []  hurricaneCategory = new int[64];
double [] hurrcanePressure = new double[64];
double tempKnots;
double knotsToMph; 
double [] hurricaneWindSpeeds = 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.print(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();
    tokenElements = token[counter].split("  ");
    counter++;
}
int counter2 = 0;
for(String line:tokenElements) 
{
System.out.println(tokenElements[counter2]);
counter2++;
}
}

【问题讨论】:

    标签: java arrays file printing lines


    【解决方案1】:

    在“while 循环”中移动“for 循环”。

        while(inFile.hasNextLine()){
            token[counter] = inFile.nextLine();
            tokenElements = token[counter].split("  ");
            counter++;
    
            for(String part:tokenElements){
                System.out.println(part);
            }
       }
    

    【讨论】:

    • 抛出越界异常 D:
    【解决方案2】:

    在那个循环中:

    while(inFile.hasNextLine()) 
    {
        token[counter] = inFile.nextLine();
        tokenElements = token[counter].split("  ");
        counter++;
    }
    

    您正在将tokenElements 替换为读取的最后一行的元素。然后,如果后面的“for 循环”您似乎认为 tokenElements 包含每一行。不是这种情况。您应该将最后一行添加到列表中,然后打印该列表。

    所以一开始你定义:

    List<String[]> lines = new ArrayList<>();
    

    然后你修改你的“while循环”:

    while(inFile.hasNextLine()) 
    {
        token[counter] = inFile.nextLine();
        lines.add(token[counter].split("  "));
        counter++;
    }
    

    然后你可以打印所有的行:

    for (String[] tokenElements : lines) {
         for (String token : tokenElements) {
              System.out.print(token + " ");
         }
         System.out.println();
    }
    

    一般来说,您应该使用自动增长的列表,而不是像 String[128] 这样的具有神奇值的数组。

    【讨论】:

    • 在文件开头(类声明之前)写入import java.util.List; 和import java.util.ArrayList;。在 Eclipse 中,您可以简单地执行 Ctrl-Shift-O。你也应该看看一些关于集合的教程,它非常有用。
    • 你不知道如何导入 List 和 ArrayList 的事实让我觉得你还在学习这门语言。我重申,您应该阅读一些教程以了解基础知识。例如在docs.oracle.com/javase/tutorial/index.html
    • 如果我没有提供一个“神奇的值”,IDE 会给我一个错误“变量可能没有被初始化”
    • 这很正常,你应该学会使用 List 并使用那个 intead :)
    【解决方案3】:

    当您使用 foreach 时,您不必使用计数器:

    for(String line : tokenElements) {
       System.out.println(line);         
    }
    

    话虽如此,您在 while 循环中用最新的内容覆盖了 tokenElements,因此只打印出最后一行,因为您的 tokenElements 仅包含一行的单词。

    您实际上可以跳过“拆分”部分,并跳过第二个计数器;-):

    while (inFile.hasNextLine()) {
        System.out.println(inFile.nextLine());
    }
    

    【讨论】:

    • 我需要拆分它,以便我可以将行中的元素转到每个数组。一行看起来像这样:year(tab)name(tab)Speed(tab)Pressure.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多