在弄清楚为什么您似乎无法在没有错误的情况下无法将值分配给ArrayList上,我花了最长的时间。
第一段代码是main方法,该方法从文本文件中逐行获取并使用定界符对行进行拆分。第一个字符串存储在一个很长的变量中,然后其他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);
}
}
}
这是Node类:
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));
}
}
}
这是Binary Tree类:
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);
}
}
}
答案 0 :(得分:0)
public Node(long cid, ArrayList<String> Sat) {
this.Satellite = new ArrayList<String>();
this.cid = cid;
for(int i = 0; i < Sat.size()-1; i++){
Satellite.add(Sat.get(i));
}
}
这里0 <9是错误的, 您遇到什么错误?
答案 1 :(得分:0)
感谢Miller Cy Chan的评论,它现在可以完美运行。
我将Node类更改为:
function AddItem {
Param(
$Object,
$Value,
[switch]$Uniq
)
$Object.Value += $Value
}
$JSON = '[["aaa", "bbb"], ["ccc", "ddd"]]' | ConvertFrom-Json
Additem -Object ([ref]$JSON) -Value "TEST"
"0 : $($JSON[0])"
"0 : $($JSON[1])"
"0 : $($JSON[2])"
我还确保每次迭代后将主菜单中的“ count”变量都改回0。