Функция бинарного дерева поиска toString () в классе Word Counter для вывода количества слов в порядке убывания - PullRequest
0 голосов
/ 24 апреля 2019

Я создал класс счетчика слов с использованием бинарного дерева поиска.Когда слово добавляется более одного раза, количество слов увеличивается.У меня уже есть нормальная функция 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 - строка, в которой я получаю исключение нулевого указателя).

...