【问题标题】:Java: Read a text file into an arrayJava:将文本文件读入数组
【发布时间】:2015-03-13 16:09:50
【问题描述】:

我有一个由两列组成的 txt 文件,如下所示:

Name1     _     Opt1
Name2     _     Opt2
Name3     _     Opt3

在每一行中都有一个名称、一个制表符分隔符、一个 _ 和另一个名称;确实有很多行(大约 150000 行),我什至不确定哪一个是最好的构造函数,我正在考虑一个二维数组,但如果它是一个更好的选择,它也可能是别的东西。对我来说,重要的是我可以使用类似 a[x][y] 的方式访问元素。 我已经这样做了,但我只知道如何计算行数或如何将每行放在数组的不同位置。 代码如下:

int countLine = 0;
    BufferedReader reader = new BufferedReader(new FileReader(filename));
    while (true) {
        String line = reader.readLine();
        if (line == null) {
            reader.close();
            break;
        } else {
            countLine++;
        }
    }

【问题讨论】:

  • “对我来说,重要的是我可以使用类似 a[x][y] 的方式访问元素。我已经做到了......”。您是否已经创建了 2d 数组,或者您正在寻求帮助? “我已经做到了”使事情变得混乱。您必须使用分隔符将“namex”和“optx”分开。
  • 不清楚你真正想问什么。
  • 我不知道如何取行的“名称”并将其放在数组的 a[x+1][y] 位置,然后将“opt”放在该位置a[x][y+1].

标签: java arrays text


【解决方案1】:

由于您事先不知道行数,因此我将使用ArrayList 而不是数组。使用正则表达式可以轻松地将行拆分为字符串值。

Pattern pattern = Pattern.compile("(.*)\t_\t(.*)");
List<String[]> list = new ArrayList<>();
int countLine = 0;

BufferedReader reader = new BufferedReader(new FileReader(filename));
while (true) {
    String line = reader.readLine();
    if (line == null) {
        reader.close();
        break;
    } else {
        Matcher matcher = pattern.matcher(line);
        if (matcher.matches()) {
            list.add(new String[] { matcher.group(1), matcher.group(2) });
        }
        countLine++;
    }

【讨论】:

  • 不需要countLine,因为list.size() 中已经存在相同的信息,但我喜欢您使用正则表达式的建议。
  • @5gon12eder countLine 部分只是从原始问题中复制而来。它的值和list.size() 之间的区别——至少在我的代码中——是后者只给你匹配 行的数量。如果所有行都匹配,则值将与countLine 相同。
  • 是的,没错。是否需要该信息。
  • 这个解决方案看起来很棒!但我有一个问题: List list = new ArrayList();它说 List 类型不是通用的,不能用参数 参数化。我正在尝试解决它,但它不起作用......
  • @Art_Knopfler 确保您导入的是 java.util.List 而不是 java.awt.List
【解决方案2】:

您应该做的第一件事是编写一个代表文件中条目的类。它可能非常复杂,但非常简单的设计可能也可以。

class Record {

    final String name;
    final String option;

    Record(final String name, final String option) {
        this.name = name;
        this.option = option;
    }
}

使用这个类比处理字符串数组要好得多。

要做的第二件事是使用比数组结构更抽象的数据结构来放入记录。这将使您摆脱必须提前知道元素数量的负担。我建议您为此使用ArrayList。然后,您可以一次读取一条记录并将其添加到您的收藏中。

List<Record> records = new ArrayList<Record>();
records.add(new Record("NameX", "OptionX"));
System.out.printf("There are %d records in the list.%n", records.size());

当然,上面示例中的第二行应该在读取文件行的​​循环中一遍又一遍地完成。

【讨论】:

    【解决方案3】:

    使用 ArrayList 代替数组,因为大小未知。使用 Scanner 读取文件,并使用 hasNextLine() 方法检查文件中是否存在下一行,

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    class Test {
        static Scanner userInput = new Scanner(System.in);
    
        public static void main(String args[]) throws FileNotFoundException {
    
            int countline = 0;
            Scanner inp=new Scanner(new File("/home/nasir/Desktop/abc.txt"));
            ArrayList<String> list=new ArrayList<String>();
    
            while(inp.hasNextLine()){
                list.add(inp.nextLine());// adding a row in ArrayList
                countline++;// counting every line/row
            }
    
            System.out.println(countline+" "+list.get(2));
        }// Main
    }// Class
    

    【讨论】:

      【解决方案4】:

      您可以将数据保存在

      哈希映射>

      第一个字符串(键)是你的名字 第二个字符串(键)是你的选择,他的值(reault)是对象结果。

      您可以将其用作:

      结果 = youHashMap.get(name).get(opt);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 2010-09-22
        • 2017-07-16
        • 2014-09-24
        • 2017-12-23
        相关资源
        最近更新 更多