Java:如何通过ArrayList中的新行读取它们并将它们存储在数组中?

时间:2017-06-06 06:28:02

标签: java arraylist java.util.scanner toarray

这是我的.txt文件的样子(但每行超过100个元素,超过100行):

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cmdb.settings")

import django
django.setup()

我想要做的是阅读此.txt文件并将其存储在Arryalist中。问题是当我读取并存储这些数据时,他们将所有这些放在同一个数组中(我希望它们存储在由一行分割的2个数组中)。

这是我的代码:

let options = {
                hAxis: {
                    format: 'd.M.yy',
                    gridlines: {count: 15},


                },
                vAxis: {
                    title: 'Cups of Coffee',

                },
                colors: ['#34495e'],
                interpolateNulls : true

            };

是否有任何建议使其有效?

6 个答案:

答案 0 :(得分:1)

我可以通过完整地读取每一行,然后拆分空格来访问每个浮点数来解决这个问题。这解决了必须区分空格和行分隔符的问题。

public class ReadStore {
    public static void main(String[] args) throws IOException {
        Scanner inFile = new Scanner(new File("Untitled.txt"));
        ArrayList<Float> temps = new ArrayList<Float>();

        while (inFile.hasNextLine()) {
            String line = inFile.nextLine();
            String[] nums = line.trim().split("\\s+");
            for (String num : nums) {
                float token = Float.parseFloat(num);
                temps.add(token);
            }
            Float [] tempsArray = temps.toArray(new Float[0]);
            for (Float s : tempsArray) {
                System.out.println(s);
            }
        }

        inFile.close();
    }
}

这是一个演示,显示逻辑适用于输入文件的单行。请注意,在分割之前,我会在每一行上调用String#trim(),以防万一我们不想要任何前导或尾随空格。

Rextester

答案 1 :(得分:0)

首先逐行阅读,然后为每一行读取每个浮点数。

试试这个:

public static void main(String[] args) throws IOException {
    Scanner inFile = new Scanner(new File("Untitled.txt"));
    List<List<Float>> temps = new ArrayList<>();

    while (inFile.hasNextLine()) {
        List<Float> data = new ArrayList<>();

        Scanner inLine = new Scanner(inFile.nextLine());
        while (inLine.hasNextFloat()) {
            data.add(inLine.nextFloat());
        }
        inLine.close();

        temps.add(data);
    }

    inFile.close();

    Float[][] dataArray = new Float[temps.size()][];

    for (int i = 0; i < dataArray.length; i++) {
        dataArray[i] = temps.get(i).toArray(new Float[temps.get(i).size()]);
    }

    System.out.println(Arrays.deepToString(dataArray));
}

输出:

[[-0.89094, -0.86099, -0.82438, -0.78214, -0.73573, -0.68691, -0.63754], [-0.42469, -0.3924, -0.36389, -0.33906, -0.31795, -0.30056, -0.28692]]

答案 2 :(得分:0)

您可以逐行阅读并按空格分割。工作和测试代码:

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

        Scanner inFile = new Scanner(new File("C:\\Untitled.txt"));
        ArrayList<String[]> temps = new ArrayList<>();

        while (inFile.hasNextLine()) {
            // find next line
            String line = inFile.nextLine();
            String[] floats = line.split("\\s+");
            temps.add(floats);
        }

        inFile.close();

        temps.forEach(arr -> {
            System.out.println(Arrays.toString(arr));
        });
    }

您还可以通过正则表达式读取浮点值。

Scanner inFile = new Scanner(new File("C:\\Untitled.txt"));
        ArrayList<Float> temps = new ArrayList<>();

        while (inFile.hasNext("-\\d\\.\\d+")) {
            // find next line
            String line = inFile.next();
            temps.add(Float.valueOf(line));
        }

        inFile.close();

答案 3 :(得分:0)

使用Files.readAllLines方法读取文件一次。并按空格分割

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        String readFileContent = readFileContent(new File("Test.txt"));
        ArrayList<Float> temps = new ArrayList<Float>();
        String[] split = readFileContent.split("\\s+");
        for (String num : split) {
             float token = Float.parseFloat(num.trim());
             temps.add(token);
        }

        Float [] tempsArray = temps.toArray(new Float[0]);
        for (Float s : tempsArray) {
            System.out.println(s);
        }
    }

    private static String readFileContent(File file) {
        try {
            return Files.readAllLines(file.toPath()).stream().collect(Collectors.joining("\n"));
        } catch (IOException e) {
            System.out.println("Error while reading file " + file.getAbsolutePath());
        }
        return "";
    }
}

答案 4 :(得分:0)

每行可以存储为 ArrayList ,每个ArrayList存储在另一个ArrayList中,创建Float类型的 2-Dimensional ArrayList 。 使用 java.util.Scanner.nextLine()读取每一行,然后解析每一行的浮点值。我使用另一个扫描程序来解析每一行的浮点值。 解析后,将浮点值存储到tmp ArrayList中,并将该列表添加到主List中。 务必关闭while内部的本地扫描仪。

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class ReadStore {
    public static void main(String[] args) throws IOException {
        //Input File
        Scanner inFile =new Scanner(new File("Untitled1.txt")).useDelimiter("\\s");
        //Major List (2-D ArrayList)
        ArrayList<ArrayList<Float>> list = new ArrayList<ArrayList<Float>>();
        //Reading Each Line
        while (inFile.hasNextLine()) {
            //tmp ArrayList
            ArrayList<Float> arr = new ArrayList<Float>();

            String line = inFile.nextLine();
            //local scanner to be used for parsing
            Scanner local = new Scanner(line);
            //Parsing line for flat values
            while(local.hasNext()){
                if(local.hasNextFloat()){
                    float token = local.nextFloat();
                    arr.add(token); 
                }   
            }
            //closing local Scanner
            local.close();
            //Adding to major List
            list.add(arr);
        }
        inFile.close();
        //Display List values
        for(ArrayList<Float> arrList:list){

            for(Float f : arrList){
                System.out.print(f + " ");
            }
            System.out.println();
        }        
    }
}

答案 5 :(得分:0)

我假设每条线上的浮点数可能因线而异。如果它们完全相同,我建议将它们读入一个大清单,然后将其拆分为子列表。

但是如果你想让一行中的所有浮点数都在一个列表中,那么最好的方法似乎是逐行读取文件。然后,将每一行拆分为标记,转换为浮动,并将结果收集到列表中。整体结果将是浮动列表的列表。使用Java 8流非常容​​易:

static List<List<Float>> readData() throws IOException {
    Pattern pat = Pattern.compile("\\s+");
    try (Stream<String> allLines = Files.lines(Paths.get(filename))) {
        return allLines.map(line -> pat.splitAsStream(line)
                                       .map(Float::parseFloat)
                                       .collect(Collectors.toList()))
                       .collect(Collectors.toList());
    }
}

请注意使用Files.lines获取行流,并注意在生成的流中使用try-with-resources。

如果你有Java 9,你可以通过使用Scanner而不是Pattern.splitAsStream来解析每行上的标记,从而简化这一点:

static List<List<Float>> readData9() throws IOException {
    try (Stream<String> allLines = Files.lines(Paths.get(filename))) {
        return allLines.map(Scanner::new)
                       .map(sc -> sc.tokens()
                                    .map(Float::parseFloat)
                                    .collect(Collectors.toList()))
                       .collect(Collectors.toList());
    }
}