Я создал класс счетчика слов с использованием бинарного дерева поиска.Когда слово добавляется более одного раза, количество слов увеличивается.У меня уже есть нормальная функция toString (), но моя проблема в том, что я хочу реализовать другую функцию toString (), которая печатает слова с наибольшим количеством в порядке убывания, и если количество одинаковое, они перечислены в алфавитном порядкев порядке возрастания.
Вот мой код для этой функции.Я знаю, что это некрасиво сейчас, но я планирую сжать это, когда смогу заставить это работать.Я продолжаю получать исключения нулевого указателя, когда я пытаюсь проверить его с различными строками / счетчиками, и я подозреваю, что я ошибаюсь с некоторыми из моих операторов возврата, но я не знаю, как их настроить.
public String toStringByCount()
{
return recToStringByCount(root);
}
private String recToStringByCount(Node<String> node)
{
if (node == null)
return "";
if (node.left == null && node.right == null)
{
return "\n word: " + node.data.toString() + "\t count: " + node.count;
}
String nodeCount = String.valueOf(node.count);
String nodeLeftCount = String.valueOf(node.left.count);
String nodeRightCount = String.valueOf(node.right.count);
int compareCountLeft = nodeCount.compareTo(nodeLeftCount);
int compareCountRight = nodeCount.compareTo(nodeRightCount);
if (compareCountLeft < 0 && compareCountRight > 0)
{
return recToStringByCount(node.left) + recToStringByCount(node) + recToStringByCount(node.right);
} else if (compareCountLeft > 0 && compareCountRight < 0)
{
return recToStringByCount(node.right) + recToStringByCount(node) + recToStringByCount(node.left);
} else if (compareCountLeft < 0 && compareCountRight < 0)
{
if (compareCountLeft > compareCountRight)
{
return recToStringByCount(node.left) + recToStringByCount(node.right) + recToStringByCount(node);
} else if (compareCountRight > compareCountLeft)
{
return recToStringByCount(node.right) + recToStringByCount(node.left) + recToStringByCount(node);
}
} else if (compareCountLeft > 0 && compareCountRight > 0)
{
if (compareCountLeft > compareCountRight)
{
return recToStringByCount(node) + recToStringByCount(node.left) + recToStringByCount(node.right);
} else if (compareCountRight > compareCountLeft)
{
return recToStringByCount(node) + recToStringByCount(node.right) + recToStringByCount(node.left);
}
} else if (compareCountLeft == 0 && compareCountRight < 0)
{
return recToStringByCount(node.right);
} else if (compareCountLeft == 0 && compareCountRight > 0)
{
return recToStringByCount(node);
} else if (compareCountRight == 0 && compareCountLeft < 0)
{
return recToStringByCount(node.left);
} else if (compareCountRight == 0 && compareCountLeft > 0)
{
return recToStringByCount(node);
} else if (compareCountRight == 0 && compareCountLeft == 0)
{
return recToStringByCount(node.right) + recToStringByCount(node) + recToStringByCount(node.left);
}
return recToStringByCount(node.left) + "\n word: " + node.data.toString() + "\t count: " + node.count + recToStringByCount(node.right);
}
Мой контейнерный класс Node:
public class Node<String>
{
public String data;
public int count = 1;
public Node<String> left, right;
public Node(String data)
{
this.data = data;
left = null;
right = null;
}
}
private Node<String> root;
Вот моя функция добавления и другая функция toString (), при необходимости, также:
public void Add(String word)
{
root = recAdd(root, new Node<String>(word));
}
private Node<String> recAdd(Node<String> node, Node<String> newNode)
{
// base case - found open slot
if (node == null)
{
return newNode;
}
// general case - add to right
final int comparison = newNode.data.compareTo(node.data);
if (comparison > 0)
{
node.right = recAdd(node.right, newNode);
}
// general case - add to left
else if (comparison < 0)
{
node.left = recAdd(node.left, newNode);
}
// if word values are the same, increment word count
else
{
node.count++;
}
return node;
}
public String toString()
{
return recInOrderToString(root);
}
private String recInOrderToString(Node<String> node)
{
if (node == null)
{
return "";
}
return recInOrderToString(node.left) + "\n word: " + node.data.toString() + "\t count: " + node.count + recInOrderToString(node.right);
}
Как я уже сказал, я думаю, что либо мойвозвращаемые функции не работают, или я сделал ошибку при преобразовании значений node.count в String, чтобы сравнить их (nodeLeftCount - строка, в которой я получаю исключение нулевого указателя).