将文本文件扫描到ArrayList <arraylist <string>&gt;

时间:2015-11-17 16:54:05

标签: java file-io arraylist pagerank

我正在尝试将文本文件读入ArrayList<ArrayList<String>>

文件看起来像:

A D E F
B A F
C A B D
D B C
E B C D F
F A B D
G
H A D F

以下是我的代码:

private static void registerPages() throws IOException {
        Scanner input = new Scanner(new File(webPath));
        //input.useDelimiter(" ");


        ArrayList<ArrayList<String>> arrayList = new ArrayList<>();
        ArrayList<String> row = new ArrayList<>();
        String tempStr;
        String[] tempArr;

        while (input.hasNextLine())
        {
            row.clear();
            tempStr = input.nextLine(); //get row in string
            tempArr = tempStr.split(" "); //split string into strings[]
            Collections.addAll(row, tempArr); //add each strings[] to arrayList
            arrayList.add(row); //add arrayList to arrayList
        }

        System.out.println("arrayList:\n" + arrayList);

    }

输出结果为:

arrayList:
[[H, A, D, F], [H, A, D, F], [H, A, D, F], [H, A, D, F], [H, A, D, F], [H, A, D, F], [H, A, D, F], [H, A, D, F]]

想要的输出是:

arrayList:
[[A, D, E, F], [B, A, F], [C, A, B, D], [D, B, C], [E, B, C, D, F], [F, A, B, D], [G], [H, A, D, F]]

仅供参考, 这个文本文件应该是一个webgraph。第一个词是网页。同一行中的下一个词是链接到此网页的其他网页(链接内)。最终,我应该编写“排名”的代码。算法

提前谢谢你。

5 个答案:

答案 0 :(得分:2)

而不是使用Update Layer Tree尝试在每次迭代中实例化行。 row.clear()

提示:
您只创建一次row = new ArrayList<>()。因此,arrayList中的所有项目持有者都指向相同的内存块。您必须创建新实例(内存中的Real对象),以便它们可以保存不同的值。

答案 1 :(得分:1)

public static void main(String[] args) {
    File file = new File("webpath.txt"); // Your text file
    ArrayList<List<String>> arrayList = new ArrayList<>();

    try(Scanner sc = new Scanner(file)) {
        List<String> arrayRow = new ArrayList<>();

        while (sc.hasNextLine()) {
            String line = sc.nextLine(); // Retrieve 1 line from the text file
            String[] data = line.split(" "); // Splitting the characters and storing them
            arrayRow = Arrays.asList(data); // Converting array to List
            arrayList.add(arrayRow); // Adding row of characters to the final arraylist
        }
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    // Looping through the result arraylist
    for (List<String> array : arrayList) {
        for(String item : array) {
            System.out.print(item + " ");
        }
        System.out.println();
    }
}

答案 2 :(得分:1)

问题是您正在重复使用并添加arrayList表示row的同一列表实例(因此它会打印N次当前/最后状态)。您应为每行创建 列表,然后将其添加到主列表中。

只需在循环中移动ArrayList<String> row = new ArrayList<>();即可。

答案 3 :(得分:0)

您在arrayList中多次添加相同的行。每次修改同一行,最后只有最后一行插入很多次。你必须每次都创建新行:put line ArrayList row = new ArrayList&lt;&gt;(); 代替 row.clear();

答案 4 :(得分:0)

public static void main(String[] args) throws IOException {
    registerPages(new FileReader("test.txt"));
}

private static void registerPages(Reader reader) throws IOException {
    Scanner input = new Scanner(reader);
    List<List<String>> arrayList = new ArrayList<>();

    while (input.hasNextLine()) {
        List<String> row = new ArrayList<>();
        Collections.addAll(row, input.nextLine().split(" "));
        arrayList.add(row);
    }

    System.out.println("arrayList:\n" + arrayList);
}

输出:

arrayList:
[[A, D, E, F], [B, A, F], [C, A, B, D], [D, B, C], [E, B, C, D, F], [F, A, B, D], [G], [H, A, D, F]]

您的代码存在的问题是您经常在同一个row实例上运行。主arrayList实例在其中多次具有相同的List实例,并且您不断重新添加相同的实例,每次都为其清除并设置新数据。这就是为什么你在arrayList的所有条目上看到相同结果的原因 - 它基本上包含多次相同的列表。这是因为列表是一个可变对象 - 它的状态可以修改,并且通过将其传递给另一个数据结构不会阻止它反映在其他数据结构中对它所做的更改。通过传递对象(例如,传递给另一个方法)并不意味着您正在复制其内容,而是使用其他方法共享该对象。两者都看到了相同的对象 - 共享对象的更改对两者都可见。