Java文本文件解析成数组

3

我需要将文本文件中的小型数据库进行翻译,以下是其内容:

abc   def   zed   fgf

qwe   zxc   ghj   cvb ...

我希望你能够将其转换为:

Array1 = [abc,   def,   zed,   fgf]

Array2 = [qwe,   zxc,   ghj,   cvb] ...

我将在其中搜索词语。

FileReader input = new FileReader("myFile");
BufferedReader bufRead = new BufferedReader(input);
String myLine = null;

while ( (myLine = bufRead.readLine()) != null)
{    
    String[] array1 = myLine.split(":");
    // check to make sure you have valid data
    String[] array2 = array1[1].split(" ");
    for (int i = 0; i < array2.length; i++)
        function(array1[0], array2[i]);
}

如何使用此示例代码完成此操作?

你的代码有什么问题? - markspace
1
你是想把整行存储在数组的第一个索引中吗?还是你是想要像String[] Array1这样的东西,其中元素0 = abc,元素1 = def,元素2 = zed等等? - robotlos
1
你为什么要使用myLine.split(":");,这不意味着文件看起来更像是abc:def zed fgf吗? - Jorn Vernee
1
@bubblebobble,我理解了。我问的是数组的长度。我认为你的意思是Array1 = []{abc, def, zed, ...}而不是Array1 = []{abc def zed ...}。这两者完全不同。在第一个中,您正在创建每行值的长度数组。在第二个中,您正在创建长度为1的数组,并将整行放入第一个索引中。 - robotlos
哦,好的抱歉..像这样 Array1 = []{abc, def, zed, ...} - user5469190
显示剩余4条评论
2个回答

2
为了拥有一个数组的数组,您可以使用 ArrayList 如下所示:
    List<String[]> arrayList = new ArrayList<>();

    while ((myLine = bufRead.readLine()) != null) {
        String[] vals = myLine.split("   ");
        arrayList.add(vals);
    }

这将遍历每一行,将其转换为数组,然后将其存储在ArrayList中。

之后,您可以像这样迭代遍历ArrayList:

for (String[] currLine : arrayList) {
    for (String currString : currLine) {
         System.out.print(currString + " ");
    }
    System.out.println();
}

这将打印:
run: abc def zed fgf qwe zxc ghj cvb BUILD SUCCESSFUL(总时间:0秒)
编辑 创建了一个方法,可以查找您要查找的值的索引。然而我建议像"zxc"这样搜索的结果应该是1,1而不是2,2,因为数组从0开始索引。
public static int[] getIndex(List<String[]> arrayList, String tofind) {
    int[] index = new int[]{-1, -1};
    for (int i = 0; i < arrayList.size(); i++) {
        String[] currLine = arrayList.get(i);
        for (int j = 0; j < currLine.length; j++) {
            if (currLine[j].equals(tofind)) {
                index = new int[]{i + 1, j + 1};
                return index;
            }
        }
    }
    return index;
}

虽然这不是最高效的方法(它会遍历每个数组和该数组中的每个字符串),但它确实可以得到您想要的结果:
像这样调用它:
    int[] zxcIndex = getIndex(arrayList, "zxc");
    System.out.println(zxcIndex[0] + ", " + zxcIndex[1]);

将会打印出:

2, 2

我在处理这个问题时编写了这个print方法,你可以方便地将其用于调试:

public static void printList(List<String[]> arrayList) {
    for (String[] currLine : arrayList) {
        for (String currString : currLine) {
            System.out.print(currString + " ");
        }
        System.out.println();
    }
}

此外,如果你想在特定的索引位置更新数据,这样做会更简单:

public static void updateIndex(List<String[]> arrayList, int[] toUpdate, String value) {
    String[] rowToUpdate = arrayList.get(toUpdate[0] - 1);
    rowToUpdate[toUpdate[1] - 1] = value;
}

将所有内容放在一起,运行以下命令:

    System.out.println("Current list:");
    printList(arrayList);

    int[] zxcIndex = getIndex(arrayList, "zxc");
    System.out.println("\nIndex of xzc is: " + zxcIndex[0] + ", " + zxcIndex[1] + "\n");

    updateIndex(arrayList, zxcIndex, "lmnop");

    System.out.println("Modified list at index " + zxcIndex[0] + "," + zxcIndex[1] + " :");
    printList(arrayList);

结果为:

运行:
当前列表:
abc def zed fgf
qwe zxc ghj cvb

xzc的索引是:2, 2

在索引2,2处修改后的列表为:
abc def zed fgf
qwe lmnop ghj cvb
构建成功(总时间:0秒)


感谢。我怎样可以搜索任何字符串并确定它的索引? - user5469190
1
给我一个你正在寻找的东西的例子。 - robotlos
zxc 我想知道它在 List[x][y] 中的位置。这样当我打印这些索引时,我就可以轻松地找到该值 :/ - user5469190
1
你期望搜索zxc的结果是什么?包含xzc的数组索引吗?因此,在这种情况下,qwe zxc ghj cvb将返回1(因为它是ArrayList中的第二个数组)。 - robotlos
1
@bubblebobble,好的,让我想一下。 - robotlos
显示剩余2条评论

0

String[][]会对您有所帮助。对于每一行,您将拥有一个包含两个其他数组的数组,这些数组的值由您的分隔符分割。

String[][] array = new String[(int)bufRead.lines().count()][2];
for(int i = 0; (myLine = bufRead.readLine()) != null); ++i) {    
   array[i][0] = myLine.split(":");
   array[i][1] = array[i][0].split(" ");
   ...
}

这只是针对两行文本还是超过两行? - user5469190
这是关于编程的相关内容。请仅返回翻译后的文本。 - Andrew Tobilko
我们如何找到 [SIZE]? - user5469190
@bubblebobble,SIZE == (int)bufRead.lines().count(),我已经更正。 - Andrew Tobilko
@bubblebobble,Java 8的解决方案 - Andrew Tobilko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接