Двоичное дерево поиска для менеджера инвентаризации в выпуске Java println

Я создал программу для управления DVD в Java с помощью бинарного дерева поиска. У меня все работает так, как я хочу, кроме команды add. Когда фильм добавляется с помощью команды "а", например:

a finding nemo

Программа должна проверить несколько условий, а затем добавить фильм. Условия следующие: -Если дерево пустое, добавьте фильм в дерево с копией по умолчанию 1. -Если дерево не пустое, найдите дерево и сравните заголовок каждого фильма в дереве с заголовком. фильма, который будет добавлен к дереву. Если заголовок найден в дереве, обновите копию этого фильма на 1. - Если заголовок не найден в дереве, просто добавьте фильм в дерево с его копией по умолчанию 1.

Вот код, который я должен заставить его работать:

case 'a':
  movieToCommand = input.substring(2, input.length()).toLowerCase();

  if (movies.isEmpty()) {
    movies.add(new Dvd(movieToCommand));
    System.out.println("\"" + movieToCommand + "\"" + " has been added "
      + "to the inventory.");
  } else /*(!movies.isEmpty())*/ {
    boolean found = false;
    addIfNotEmpty(movies.returnRoot(), 1, movieToCommand, found);

    if (!found) {
      movies.add(new Dvd(movieToCommand));
      System.out.println("\"" + movieToCommand + "\"" + " has been " 
        + "added to the inventory.");
    }
  }
break;

public static void addIfNotEmpty(DvdTreeNode root, int level, 
  String movieToCommand, boolean found) {
    if (root == null) {
      return;
    }
    addIfNotEmpty(root.getRight(), level+1, movieToCommand, found);
    if (root.getItem().getTitle().equalsIgnoreCase(movieToCommand)) {
      root.getItem().addCopy();
      System.out.println("You have added another copy of \""
        + movieToCommand
        + "\" to the inventory.");
        found = true;
      }
    addIfNotEmpty(root.getLeft(), level+1, movieToCommand, found);
    }

Проблема, с которой я столкнулся, заключается в следующем: мои методы добавления для добавления фильма и добавления фильма, который уже существует в дереве, работают нормально, за исключением того, что он выводит подтверждающее сообщение дважды, например так: (Пираты Карибского моря уже существуют в инвентаре и имеет 1 копию для тестирования)

a pirates of the caribbean

Добавляет еще одну копию пиратов в инвентарь.

You have added another copy of “pirates of the caribbean” to the inventory.

Это первое подтверждающее сообщение, которое отображается.

“pirates of the caribbean" has been added to the inventory.

Это второе подтверждающее сообщение, которое отображается.

Почему распечатываются оба сообщения и как это исправить?


РЕДАКТИРОВАТЬ:

Вот что я изменил в своем коде, основываясь на моей интерпретации ответа rgettman:

case 'a':
  movieToCommand = input.substring(2, input.length()).toLowerCase();

  if (movies.isEmpty()) {
    movies.add(new Dvd(movieToCommand));
    System.out.println("\"" + movieToCommand + "\"" + " has been added "
    + "to the inventory.");
  } else /*(!movies.isEmpty())*/ {
    boolean found;
    found = addIfNotEmpty(movies.returnRoot(), 1, movieToCommand);

    if (!found) {
      movies.add(new Dvd(movieToCommand));
      System.out.println("\"" + movieToCommand + "\"" + " has been " 
      + "added to the inventory.");
    }
  }
break;

public static boolean addIfNotEmpty(DvdTreeNode root, int level, 
  String movieToCommand) {
    boolean found = false;
    if (root == null) {
      return false;
    }
    addIfNotEmpty(root.getRight(), level+1, movieToCommand);
    if (root.getItem().getTitle().equalsIgnoreCase(movieToCommand)) {
      root.getItem().addCopy();
      System.out.println("You have added another copy of \""
      + movieToCommand
      + "\" to the inventory.");
      found = true;
    }
    addIfNotEmpty(root.getLeft(), level+1, movieToCommand);
    return found;
  }

Проблема, с которой я столкнулся сейчас:

Я добавляю фильм: "Пираты Карибского моря". Пираты Карибского моря добавляются с одной копией. Затем я добавляю другой фильм: "Нахождение немо". Находится "Немо", добавляется одна копия. копия добавляется, но она по-прежнему отображает оба подтверждающих сообщения. Затем я пытаюсь добавить еще одну копию "Пиратов Карибского моря": "Пираты Карибского моря". Добавляется еще одна копия, и только 1 подтверждающее сообщение отображается так, как должно быть.

    Enter a command (H for help): 
    a pirates of the caribbean
    "pirates of the caribbean" has been added to the inventory.

    Enter a command (H for help): 
    a finding nemo
    "finding nemo" has been added to the inventory.

    Enter a command (H for help): 
    a finding nemo
    You have added another copy of "finding nemo" to the inventory.
    "finding nemo" has been added to the inventory.

    Enter a command (H for help): 
    a pirates of the caribbean
    You have added another copy of "pirates of the caribbean" to the inventory.

Что я сделал не так в своих правках?

1 ответ

Ваш addIfNotEmpty метод занимает boolean параметр для found что вы ожидаете, чтобы содержать заданное значение в методе, в котором вы его вызываете, в случае вызывающего метода.

Однако в Java параметры передаются по значению. Вы изменяете копию found в addIfNotEmptyне дела found переменная.

Вместо изменения параметра верните значение.

public static boolean addIfNotEmpty(DvdTreeNode root, int level, 
  String movieToCommand) {

Затем объявите местный found переменная в addIfNotEmptyустановите его, как вы уже делаете, а затем верните его. Установите результат вызова метода для вашего вызывающего метода found,

Другие вопросы по тегам