Java:根据摩尔斯电码创建一棵树
Java: Creating a Tree based on Morse Code
给定字母表和每个字母的摩尔斯电码值...
a._
b_...
c_._.
d_..
e.
f.._.
我正在尝试创建一棵树,通过扫描代码找到一个字母在树中的位置,然后向左分支为点,向右分支为破折号。
我创建了一个节点 class,其中包含典型的 numberNode left
和 numberNode right
变量以及 morseCode
和 letter
。这是我的功能。
aList
是从文件中读入的已创建节点的数组列表。 rootNode
是树的根,没有集合 letter
或 morsecode
。
public static void createTree(ArrayList<numberNode> aList, numberNode rootNode)
{
for (numberNode n : aList) //for each numberNode in aList
{
int lengthOfCode = n.getmorseCode().length()-1; //get the length of the morsecode
numberNode currentNode = rootNode; //sets currentNode to the rootNode at first
for (int i=0; i<lengthOfCode; i++)
{
char c = n.getmorseCode().charAt(i); //for each char in morsecode until it gets to the end
if (c == '.')
{
if (currentNode.getleft() = null) //if currentnode left is null
{
numberNode newLeftNode = new numberNode(); //create new node
currentNode.setleft(newLeftNode); //set current node left to the new node
if (i == lengthOfCode)
{
currentNode.setleft(n); //if end of morse code, set the current node left's to n
}
else
{
currentNode = newLeftNode; //else change current node to the newly created leftnode
}
}
else //if current node left is not null
{
if (i == lengthOfCode)
{
currentNode.setleft(n); //if at end of morse code
}
currentNode = currentNode.getleft(); //if not at end set current node to current node's left
}
}
if (c == '_')
{
if (currentNode.right() =null)
{
numberNode newRightNode = new numberNode();
currentNode.setleft(newRightNode);
if (i == lengthOfCode)
{
currentNode.setright(n);
}
else
{
currentNode = newRightNode;
}
}
else
{
if (i == lengthOfCode)
{
currentNode.setright(n);
}
currentNode = currentNode.getright();
}
}
}
}
}
我有几个问题...
我的算法至少是正确的吗?
有没有另一种方法可以做到这一点而不那么丑陋?
如果您需要查看更多我的代码,请随时询问。感谢您的宝贵时间,我真的很感激!
编辑:当前运行,但获得当前输出
a
null
null
b
null
null
c
null
null
d
null
null
有什么问题吗?
编辑#2:添加了我的 class
class numberNode
{
String morseCode;
String letter;
numberNode left;
numberNode right;
int occupied;
public numberNode()
{
this.occupied=0;
left = null;
right = null;
}
public void setmorseCode(String aCode)
{
morseCode = aCode;
}
public String getmorseCode()
{
return morseCode;
}
public void setletter(String aLetter)
{
letter = aLetter;
}
public String getletter()
{
return letter;
}
public void setleft(numberNode aNode)
{
left = aNode;
}
public numberNode getleft()
{
return left;
}
public void setright(numberNode aNode)
{
right = aNode;
}
public numberNode getright()
{
return right;
}
}
如果 currentNode.getleft()
returns 为 null,则尝试对其调用 equals 会给您带来 NPE。您使用 ==:
测试 null
if (currentNode.getleft() == null) ....
给定字母表和每个字母的摩尔斯电码值...
a._
b_...
c_._.
d_..
e.
f.._.
我正在尝试创建一棵树,通过扫描代码找到一个字母在树中的位置,然后向左分支为点,向右分支为破折号。
我创建了一个节点 class,其中包含典型的 numberNode left
和 numberNode right
变量以及 morseCode
和 letter
。这是我的功能。
aList
是从文件中读入的已创建节点的数组列表。 rootNode
是树的根,没有集合 letter
或 morsecode
。
public static void createTree(ArrayList<numberNode> aList, numberNode rootNode)
{
for (numberNode n : aList) //for each numberNode in aList
{
int lengthOfCode = n.getmorseCode().length()-1; //get the length of the morsecode
numberNode currentNode = rootNode; //sets currentNode to the rootNode at first
for (int i=0; i<lengthOfCode; i++)
{
char c = n.getmorseCode().charAt(i); //for each char in morsecode until it gets to the end
if (c == '.')
{
if (currentNode.getleft() = null) //if currentnode left is null
{
numberNode newLeftNode = new numberNode(); //create new node
currentNode.setleft(newLeftNode); //set current node left to the new node
if (i == lengthOfCode)
{
currentNode.setleft(n); //if end of morse code, set the current node left's to n
}
else
{
currentNode = newLeftNode; //else change current node to the newly created leftnode
}
}
else //if current node left is not null
{
if (i == lengthOfCode)
{
currentNode.setleft(n); //if at end of morse code
}
currentNode = currentNode.getleft(); //if not at end set current node to current node's left
}
}
if (c == '_')
{
if (currentNode.right() =null)
{
numberNode newRightNode = new numberNode();
currentNode.setleft(newRightNode);
if (i == lengthOfCode)
{
currentNode.setright(n);
}
else
{
currentNode = newRightNode;
}
}
else
{
if (i == lengthOfCode)
{
currentNode.setright(n);
}
currentNode = currentNode.getright();
}
}
}
}
}
我有几个问题...
我的算法至少是正确的吗?
有没有另一种方法可以做到这一点而不那么丑陋?
如果您需要查看更多我的代码,请随时询问。感谢您的宝贵时间,我真的很感激!
编辑:当前运行,但获得当前输出
a
null
null
b
null
null
c
null
null
d
null
null
有什么问题吗?
编辑#2:添加了我的 class
class numberNode
{
String morseCode;
String letter;
numberNode left;
numberNode right;
int occupied;
public numberNode()
{
this.occupied=0;
left = null;
right = null;
}
public void setmorseCode(String aCode)
{
morseCode = aCode;
}
public String getmorseCode()
{
return morseCode;
}
public void setletter(String aLetter)
{
letter = aLetter;
}
public String getletter()
{
return letter;
}
public void setleft(numberNode aNode)
{
left = aNode;
}
public numberNode getleft()
{
return left;
}
public void setright(numberNode aNode)
{
right = aNode;
}
public numberNode getright()
{
return right;
}
}
如果 currentNode.getleft()
returns 为 null,则尝试对其调用 equals 会给您带来 NPE。您使用 ==:
if (currentNode.getleft() == null) ....