Java:如何有选择地将文件扫描成两个2d字符串数组

时间:2016-05-30 06:08:36

标签: java arrays java.util.scanner

如何选择性地将文件扫描成两个2d字符串数组?

我有一个看起来像这样的文件:

2014 fruit apple red 50 30
2015 vegetable spinach green 10
2014 fruit orange orange 100
2014 fruit banana yellow 90 100
2015 vegetable corn yellow 120

我试图读取文件并将每行放入2d字符串数组(用空格分隔)。我想要一个仅以2014年开头的线条形成的数组,以及从2015年开始的线条形成的第二个数组。

因为它是针对某个类的,所以我坚持使用严格的参数1.它必须来自文本文件,并且2.它必须进入两个2d数组。

我能够成功地将整个文件读入一个2d String数组,但我为两个数组尝试的所有内容似乎都失败了。这就是我所得到的...... 成功的单一2D阵列:

public static void main(String[] args) throws Exception {

    //Initializes the variables needed to read the line length of the file
    FileReader fr = null;
    LineNumberReader lnr = null;
    File newFile = new File("ProjectTest.txt");

    //Initiallizes the variables needed to create the 2D array
    BufferedReader inputStream = new BufferedReader(new FileReader(newFile));
    Scanner scannerIn = new Scanner(inputStream);

    //Other variables
    int lineNum = 0;
    int linesCounter = 0;
    String str;

    //Determines how many lines in the file
    try {
        fr = new FileReader(newFile);
        lnr = new LineNumberReader(fr);
        while (lnr.readLine() != null) {
            lineNum++;
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    } finally {
        if (fr != null) {
            fr.close();
        }
        if (lnr != null) {
            lnr.close();
        }
    }

//Create the 2D array
    String arrayA[][] = new String[lineNum][];

    while (scannerIn.hasNextLine() && linesCounter < lineNum) {
        arrayA[linesCounter] = scannerIn.nextLine().split("\\s");
       linesCounter++;
    }

//Test-print the array
for (int i = 0; i< lineNum; i++){
         System.out.println(arrayA[i][2]);
     }
}

我已经尝试了许多不同的方法来尝试将这些数据分成两个阵列,但我认为我的困惑来自于知道何时以及如何使用扫描仪和缓冲读取器。我试过if / then语句,只将2014行读入数组,并且我尝试将一个数组复制到另一个数组。毋庸置疑,我把它们弄错了。这是使用if / then语句的两个2d数组的多次尝试之一:

String arrayA[][] = new String[lineNum][];
String arrayB[][] = new String[lineNum][];

String line = inputStream.readLine();

    while (line != null) {
        if (line.contains("2014")){
            arrayA[linesCounter] = inputStream.readLine().split("\\s");
            linesCounter++;
        } else {
            arrayB[linesCounter] = inputStream.readLine().split("\\s");
            linesCounter++;
        }
    }

请帮帮我!!我感谢你们所有人!

4 个答案:

答案 0 :(得分:1)

以下是一种方法:

String[][] arrayA = new String[lineNum][];
String[][[ arrayB = new String[lineNum][];

int counterA = 0;
int counterB = 0;

while (scannerIn.hasNextLine()) {
    String line = scannerIn.nextLine();
    String[] parts = line.split("\\s");
    if (line.startsWith("2014")) {
        arrayA[counterA++] = parts;
    } else if (line.startsWith("2015")) {
        arrayB[counterB++] = parts;
    }
}

// prune excess elements
arrayA = Arrays.copyOf(arrayA, counterA);
arrayB = Arrays.copyOf(arrayB, counterB);

答案 1 :(得分:0)

尝试在运行if else语句之前拆分字符串。那么你的目标是

tempString[0]

与日期进行比较

答案 2 :(得分:0)

这样做的一种方法是:

    File fin = new File("your_file_path");
    FileInputStream fis = new FileInputStream(fin);

    //Construct BufferedReader from InputStreamReader
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
        String line = null;
        int lineNum = 1024;
        String [][] linesWith2014 = new String[lineNum][];
        String [][] linesWith2015 = new String[lineNum][];
        int countWith2014 = 0 ;
        int countWith2015 = 0;

        while ((line = br.readLine()) != null) {
            System.out.println(line);
            if (line.startsWith("2014")){
                linesWith2014[countWith2014++] = line.split("\\s+");
            }else if (line.startsWith("2015")){
                linesWith2015[countWith2015++] = line.split("\\s+");
            }
        }

        br.close();

        linesWith2014 = Arrays.copyOf(linesWith2014, countWith2014);
        linesWith2015 = Arrays.copyOf(linesWith2015, countWith2015);

当然用try catch包围它。

答案 3 :(得分:0)

在大多数情况下,最好是收集集合中的数据,而不是数组。

我只想创建两个数组列表,例如类型

ArrayList<ArrayList<String>>

并逐行填写。无需提前计算任何内容。

然后只需从列表中创建数组,现在很容易知道大小:)

单个列表的示例:

List<List<String>> list = new ArrayList<>();

// fill the list of lists...

// convert the list of lists to a 2D array...
String[][] array = new String[list.size()][];

int index = 0;
for (List<String> sublist : list)
{
    array[index] = sublist.toArray(new String[sublist.size()]);
    ++index;
}