【问题标题】:Binary search tree for an inventory manager in Java println issueJava println问题中库存管理器的二进制搜索树
【发布时间】:2025-12-25 06:20:19
【问题描述】:

我创建了一个程序来使用二叉搜索树在 Java 中管理 DVD。除了 add 命令之外,我让一切都按照我想要的方式工作。当使用命令“a”添加电影时,如下所示:

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;
  }

我现在遇到的问题是:

我加了一部电影:加勒比海盗 加勒比海盗增加了一份 然后我添加另一部电影:海底总动员 海底总动员添加一份副本 然后我尝试添加另一个海底总动员副本:海底总动员 添加了另一个副本,但它仍然显示两个确认消息。 然后我尝试添加另一个加勒比海盗:加勒比海盗 添加了另一个副本,并且只有一条确认消息以应有的方式显示。

    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.

我在编辑中做错了什么?

【问题讨论】:

  • 您将 boolean found 视为可变对象。这是一个原始的。请注意,非原始布尔值是不可变的,因此即使您要使用它,问题仍然存在。

标签: java boolean binary-search-tree inventory-management


【解决方案1】:

您的addIfNotEmpty 方法为found 采用boolean 参数,在调用方法的情况下,您希望在调用它的方法中包含您的设置值。

但是,在 Java 中,参数是按值传递的。您正在修改addIfNotEmptyfound副本,而不是案例的found 变量。

不要修改参数,而是返回值。

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

然后在addIfNotEmpty 中声明一个本地的found 变量,按照你已经在做的那样设置它,然后返回它。将方法调用的结果设置为调用方法的found

【讨论】:

  • 你能再看看我的问题吗?我试着按照你说的做,但我现在遇到了另一个问题。