将输入字符串转换为2维数组,然后使用索引文件提取它

时间:2013-05-28 10:47:09

标签: java

这是我想要做的,比如说我有一个这种格式的输入文件(input.txt),行数或列数可以不同,列用空格分隔:

the       DT   B-NP
current   JJ   I-NP
account   NN   I-NP
deficit   NN   I-NP
will      MD   B-VP << CURRENT TOKEN
narrow    VB   I-VP
to        TO   B-PP
only      RB   B-NP

我想把每个单词都放到2维数组x [i,j]的元素中,这样我就可以使用索引文件了:

x[0,0]
x[0,1]
x[-1,0]
x[-2,1]

得到这个结果:

will
MD
deficit
NN

括号中的数字是数组的i,j索引,起始位置[0,0]是标有“&lt;&lt;&lt; CURRENT TOKEN”的行的第一个单词(在这种情况下是单词“will”)。

所以现在我可以通过以下方式将文件读取到数组:

import java.awt.List;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;



public class ReadfileIntoArray {

    String[] data = new String[100];

    public void read() throws IOException {


        FileReader fr = new FileReader("/Users/home/Documents/input.txt");
        BufferedReader br = new BufferedReader(fr);
        String line;

        System.out.println("Print from here:");
        int i = 0;
        while ((line = br.readLine()) != null) {
            data[i] = line;
            System.out.println(data[i]);
            i++;
        }
        br.close();
        // This is for resize the data array (and data.length reflect new size)
        String[] dataNew = new String[i];
        System.arraycopy(data, 0, dataNew, 0, i);
        data = dataNew;
        System.out.println("Data length: " + data.length);
    }

    public static void main(String[] args) throws IOException {
        ReadfileIntoArray rfta = new ReadfileIntoArray();
        rfta.read();
    }
}

但是当我搜索时,我可能需要使用

List<String> arrList =FileUtils.readLines(new File("myfile.txt"));  

对于未定义的长度(??)不是很确定但我认为需要导入特殊包才能使用它,我收到错误 _ 第二件事是如何确定位置[0,0]的起始元素,以及如何指示负面指数如[-2,1] ......

我如何设法完成上述任务,对我来说这看起来很复杂。非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以使用ArrayList的ArrayList无限长度。

public void read() throws IOException {
    List<ArrayList<String>> mylist = new ArrayList<ArrayList<String>>();
    FileReader fr = new FileReader("/Users/home/Documents/input.txt");
    BufferedReader br = new BufferedReader(fr);
    String line;
    int current_line = 0; 
    int cnt = 0;

    while ((line = br.readLine()) != null) {
        String arr[];
        arr = line.split("\t");
        mylist.add(new ArrayList<String>());
        for(int i = 0; i < arr.length; i++){
            mylist.get(cnt).add(arr[i]);
            if(mylist.get(cnt).get(i).equals("<<")) 
                current_line = cnt;
        }
        cnt++;
    }
    br.close();
}

现在你有了arraylist的arraylist。

要获取第i_行的第j个元素,您应该写mylist.get(i).get(j)

这样,你不需要增加阵列的大小,并且线的长度也不重要,即第一行是10弦,第二行是15是可以接受的。

此外,请将current_line作为变量而不是负数索引,而使用current_line - 1作为索引。