【问题标题】:Checking if multiple hashmaps are empty检查多个哈希图是否为空
【发布时间】:2019-05-05 03:09:31
【问题描述】:

我正在尝试查找多个 HashMap 是否为空。

提供一些上下文。我在这里声明了一个 hashmap。

static Map<Integer, College> tblColleges = new HashMap<Integer, College>();

对于每个大学对象:

Map<Integer, Department> tblDepartments = new HashMap<Integer, Department>();

我正在尝试添加专业。专业只能作为部门的属性存在。

这是我现在拥有的。

int numberofColleges = Databases.tblColleges.size();
int emptyColleges = 0;
for(int key: Databases.tblColleges.keySet()) {
        if(Databases.getTblColleges(key).tblDepartments.isEmpty()) {
                emptyColleges++;
            }
        }
    if(numberofColleges == emptyColleges) {
        System.out.println("Invalid. Requires at least 1 department.");
    }

如果至少有 1 所大学有部门,我应该只能创建专业。

基本上对于 tblColleges 中存在的每个大学对象,我正在检查它的部门哈希图是否为空。如果它是空的,那么我增加空大学的数量。

之后,我将大学对象的数量与找到的空大学对象的数量进行比较,如果它们相等,则打印一个错误。

我想知道是否有更好更有效的方法来做到这一点,也许使用一些我不熟悉的函数而不是使用变量。

【问题讨论】:

  • 您在寻找tblColleges.isEmpty()吗?
  • 不一定,我已经在上面展示了。仅仅拥有它的问题是,可能存在这样一种情况,即我可能有多个学院存在但还没有部门。

标签: java for-loop hashmap


【解决方案1】:

问:你能“更有效”地进行检查吗?

A:你可以稍微优化一下:

boolean nonEmptyColleges = false;

for (int key: Databases.tblColleges.keySet()) {
    if (!Databases.getTblColleges(key).tblDepartments.isEmpty()) {
        nonEmptyColleges = true;
        break;
    }
}

一旦找到CollegeDepartment,上述短路。在很多情况下,这将是一个实质性的改进。

那么,假设Databases.tblCollegesMap

boolean nonEmptyColleges = false;

for (int college: Databases.tblColleges.values()) {
    if (!college.tblDepartments.isEmpty()) {
        nonEmptyColleges = true;
        break;
    }
}

问:你能用更少的代码做检查吗?

答:使用 Java 8 流,您可以将最后一个流编写为:

boolean nonEmptyColleges = Databases.tblColleges.values().stream()
           .anyMatch(c -> !c.tblDepartments.isEmpty());

(我认为...)


问:但这是正确的方法吗?

答:IMO,没有。

您似乎打算在每次添加专业时都进行此检查。那没有必要。

专业只能作为部门的属性存在。

您需要检查的关键是您要为其添加专业的部门是否存在。

  • 如果部门不存在,则无法将专业添加到其中。
  • 如果系确实存在,您可以选择它的专业,无论它目前是否是大学的系1

这里更重要的一点是,任何数据模型都会有各种数据完整性规则/约束。但这确实意味着您需要在每次更改模型时明确检查所有这些。您只需要检查变更的前提条件(例如,部门是否存在)以及可能因变更而失效的任何约束。


1 - “非”情况假设可能有其他方法可以找到Department。它可能是一个单独的 Department 对象表,也可能是您正在创建和构建一个新的 Department 并且尚未将其添加到其 College 中。

【讨论】:

  • 感谢您的建议。当您说我应该只检查我尝试添加专业的部门是否存在时,我的问题是我只知道用户选择了哪个部门之后。我希望能够打印出错误并避免让用户首先选择一个部门(如果尚不存在)。
  • Ummm ...如果一个部门不存在,用户如何选择它?
  • 对不起,我应该解释得更清楚。我的程序设置方式是它允许用户选择他们想要创建的内容(学院、系、专业)。如果他们选择创建一个专业,系统会要求选择一所大学和一个后续部门。如果无法创建专业,我想避免让他们选择学院和系。
  • 这更没有意义。逻辑应该是:1)如果没有学院,只能创建一个学院,2)如果有学院没有系,则可以创建学院或系,3)否则可以创建学院、系和专业.你不需要知道是否只有大学没有部门。如果一个系存在,那么一定有一个学院有一个系。除非您允许创建(尚未)大学的部门......在这种情况下,没有理由停止在大学以外的部门创建专业!
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2013-07-06
  • 2017-04-28
  • 1970-01-01
  • 2014-04-06
  • 2019-04-10
  • 2011-05-19
相关资源
最近更新 更多