2015-03-13 49 views
-2

我有两列像这样由一个txt文件:的Java:阅读文本文件到一个数组

Name1  _  Opt1 
Name2  _  Opt2 
Name3  _  Opt3 

在每一行中有一个名字,一个标签分隔符,一_,然后另一名;有很多行(约150000),我甚至不知道哪一个是最好的构造函数,我正在考虑一个二维数组,但如果它是一个更好的选择,它也可能是其他的东西。对我而言,能够访问具有像这样的元素[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++; 
     } 
    } 
+0

“对我来说,我可以接触到的元素像这样的东西一[X] [Y]是非常重要的我已经这样做了......“。你是否已经创建了你的二维数组或者你正在寻求什么帮助? “我这样做了”混淆了事情。您将不得不使用分隔符分隔“namex”和“optx”。 – DigitalNinja 2015-03-13 16:15:33

+0

目前还不清楚你真正想问什么。 – 2015-03-13 16:16:45

+0

我不知道如何把行的“名称”放在数组的位置a [x + 1] [y]上,并将“opt”放在位置a [x] [y + 1]。 – 2015-03-13 16:26:16

回答

2

既然你不知道时间提前的行数,我会用一个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++; 
    } 
+0

'countLine'不需要,因为'list.size()'中已经有相同的信息,但是我喜欢你使用正则表达式的建议。 – 5gon12eder 2015-03-13 16:24:08

+0

@ 5gon12eder'countLine'部分刚从原始问题复制而来。它的值和'list.size()'至少在我的代码中的区别在于后者只给你*匹配*行的数量。如果所有行匹配,则该值将与'countLine'相同。 – Thomas 2015-03-13 16:25:37

+0

是的,这是正确的。是否需要该信息。 – 5gon12eder 2015-03-13 16:27:08

0

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

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()); 

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

0

可以节省

的HashMap>

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

你可以使用它作为:

结果= youHashMap.get(名)获得(OPT);

0

使用ArrayList而不是数组,因为大小未知。使用扫描仪读取文件,并检查下一行的存在,在文件中使用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