Java 将文本文件扫描到ArrayList<;ArrayList<;字符串>&燃气轮机;

Java 将文本文件扫描到ArrayList<;ArrayList<;字符串>&燃气轮机;,java,file-io,arraylist,pagerank,Java,File Io,Arraylist,Pagerank,我正在尝试将文本文件读入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 以下是我的代码: private static void registerPages() throws IOException { Scanner input = new Scanner(new File(webPath)); //input.useDelimiter(" ");

我正在尝试将文本文件读入
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
以下是我的代码:

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。第一个词是网页。同一行中的下一个单词是链接到此网页的其他网页(在链接中)。最终,我应该编写“页面排名”算法

提前感谢。

公共静态void main(字符串[]args){
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();
    }
}
File File=新文件(“webpath.txt”);//您的文本文件 ArrayList ArrayList=新的ArrayList(); 尝试(扫描仪sc=新扫描仪(文件)){ List arrayRow=新建ArrayList(); while(sc.hasNextLine()){ String line=sc.nextLine();//从文本文件中检索1行 String[]data=line.split(“”;//拆分字符并存储它们 arrayRow=Arrays.asList(数据);//将数组转换为列表 添加(arrayRow);//将字符行添加到最终的arrayList } } catch(filenotfounde异常){ e、 printStackTrace(); } //循环遍历结果数组列表 用于(列表数组:arrayList){ for(字符串项:数组){ 系统输出打印(项目+“”); } System.out.println(); } }
公共静态void main(字符串[]args){
File File=新文件(“webpath.txt”);//您的文本文件
ArrayList ArrayList=新的ArrayList();
尝试(扫描仪sc=新扫描仪(文件)){
List arrayRow=新建ArrayList();
while(sc.hasNextLine()){
String line=sc.nextLine();//从文本文件中检索1行
String[]data=line.split(“”;//拆分字符并存储它们
arrayRow=Arrays.asList(数据);//将数组转换为列表
添加(arrayRow);//将字符行添加到最终的arrayList
}
}
catch(filenotfounde异常){
e、 printStackTrace();
}
//循环遍历结果数组列表
用于(列表数组:arrayList){
for(字符串项:数组){
系统输出打印(项目+“”);
}
System.out.println();
}
}

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


所以只需移动
ArrayList row=new ArrayList()和。

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


所以只需移动
ArrayList row=new ArrayList(),并使用。

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

提示:

您只创建了一次
。所以arrayList中的所有项目持有者都指向同一个内存块。您必须创建新实例(内存中的真实对象),以便它们可以保存不同的值。

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

提示:

您只创建了一次
。所以arrayList中的所有项目持有者都指向同一个内存块。您必须创建新实例(内存中的真实对象),以便它们可以保存不同的值。

您在arrayList中多次添加同一行。每次修改同一行,最后多次只插入最后一行。每次都必须创建新行:放置行 ArrayList行=新的ArrayList(); 代替
row.clear()

在arrayList中多次添加同一行。每次修改同一行,最后多次只插入最后一行。每次都必须创建新行:放置行 ArrayList行=新的ArrayList(); 代替 row.clear()

代码的问题在于,您一直在同一个
实例上操作。主
arrayList
实例多次在其中包含列表的同一实例,并且您不断地重新添加同一实例,每次都为其清除和设置新数据。这就是为什么在
arrayList
的所有条目上都会看到相同的结果-它基本上多次包含相同的列表。这是因为列表是一个可变对象——它的状态可以修改,通过将它传递给另一个数据结构,并不妨碍它在另一个数据结构中反映对它所做的更改。传递一个对象(例如,传递给另一个方法)并不意味着复制它的内容,而是与另一个方法共享该对象。两者都看到相同的对象,并且对共享对象的更改对双方都可见


代码的问题在于,您一直在同一个
实例上操作。主
arrayList
实例多次在其中包含列表的同一实例,并且您不断地重新添加同一实例,每次都为其清除和设置新数据。这就是为什么在
arrayList
的所有条目上都会看到相同的结果-它基本上多次包含相同的列表。这是因为列表是一个可变对象——它的状态可以修改,通过将它传递给另一个数据结构,并不妨碍它在另一个数据结构中反映对它所做的更改。传递一个对象(例如,传递给另一个方法)并不意味着复制它的内容,而是与另一个方法共享该对象。两者都看到相同的对象,并且对共享对象的更改对双方都可见。

错误与读取没有直接关系
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]]