首页 > 解决方案 > 如何为类中的 ArrayList 赋值?

问题描述

在弄清楚为什么您似乎无法将值分配给 ArrayList 而不会出现错误时,我一直在遇到麻烦。

第一个代码块是从文本文件中逐行获取并使用分隔符分割行的主要方法。第一个字符串作为 long 存储在一个变量中,然后其他 9 个字符串存储在 ArrayList 中。它对文件中的每一行都执行此操作。

我已经多次调试了这段代码,它表明数组得到​​了正确的值。

问题是当代码到达它调用插入的部分时,我在代码中对此进行了注释。

它首先创建节点,但是当它到达将第一个 ArrayList 中的值添加到新创建的 ArrayList 的部分时,一切都中断了。for 循环停止正常运行,即使达到限制,它也会继续增加。

我决定省略我也用于这个项目的 BinaryTree 类,因为它可以正常工作。

那么,我将如何正确分配传递给节点 ArrayList 的 ArrayList 中的值?

package assignment7;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import static java.lang.Long.parseLong;
import java.util.Scanner;
import java.util.ArrayList;

public class Assignment7 {

    public static void main(String[] args) throws IOException {

    boolean headerLine = true;
    String firstLine = "";
    String catchLine;
    String token;
    long s_cid;
    ArrayList<String> Arr = new ArrayList<String>();
    Scanner delimS;
    int count = 0;
    BinaryTree snomedTree = new BinaryTree();

    try(BufferedReader br = new BufferedReader(new FileReader("Data.txt"))) {

        while ((catchLine = br.readLine()) != null) {

            for(int i = 0; i < 9; i++){

                Arr.add("");

            }

            if(headerLine){

                firstLine = catchLine;
                headerLine = false;

            }

            else{

                delimS = new Scanner(catchLine);
                delimS.useDelimiter("\\|");
                s_cid = parseLong(delimS.next());

                while(delimS.hasNext()){

                    token = delimS.next();
                    Arr.set(count, token);
                    count++;

                }

//在这里运行良好然后调用这个插入函数

                  snomedTree.insert(new Node(s_cid, Arr));

            }

            Arr.clear();

        }
    }

    try (PrintWriter writer = new PrintWriter("NewData.txt")) {

        writer.printf(firstLine);
        snomedTree.inorder(snomedTree.root, writer);

    }
}

}

这是节点类:

package assignment7;

import java.util.ArrayList;



class Node {

public long cid;
public ArrayList<String> Satellite;
public Node l;
public Node r;

public Node(long cid, ArrayList<String> Sat) {
    this.Satellite = new ArrayList<String>();
    this.cid = cid;

//即使在 i = 9 之后,这个 for 循环也会继续运行 for(int i = 0; 0 < 9; i++){

        Satellite.add(Sat.get(i));

    }

}

}

这是二叉树类:

package assignment7;
import java.util.ArrayList;
import java.io.PrintWriter;


public class BinaryTree {
public Node root;
public BinaryTree() {
    this.root = null;
}
public void insert(Node x) {
    if (root == null) {
        root = x;
    } 

    else {
        Node current = root;
        while (true) {

            if (x.cid > current.cid) {
                if (current.r == null) {
                    current.r = x;
                    break;
                } 

                current = current.r;
            }

            else {
                if (current.l == null) {
                    current.l = x;
                    break;
                } 
                current = current.l;
            }
        }

    }
}

public void inorder(Node x, PrintWriter out) {

    if (x != null) {

    inorder(x.l, out);
        out.printf(String.valueOf(x.cid) + "|");
        for(int i = 0; i < 9; i++){

            if(i != 8){

                out.printf(x.Satellite.get(i) + "|");

            }

            else{

                out.printf(x.Satellite.get(i) + "\n");

            }
        }
        inorder(x.r, out);
    }


}
}

标签: javaarraylist

解决方案


感谢 Miller Cy Chan 的评论,它现在完美运行。

我将 Node 类更改为:

package assignment7;

import java.util.ArrayList;
import java.util.List;


class Node {

    public long cid;
    public ArrayList<String> Satellite;
    public Node l;
    public Node r;

    public Node(long cid, ArrayList<String> Sat) {

    this.Satellite = new ArrayList<String>(Sat.subList(0, Math.min(9, Sat.size())));
    this.cid = cid;


    }

}

我还确保在每次迭代后将 main 中的“count”变量改回 0。


推荐阅读