检查多个哈希图是否为空

时间:2019-05-05 03:09:31

标签: java for-loop hashmap

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

给出一些背景。我在这里声明了一个哈希图。

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

对于每个大学对象:

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

我正在尝试添加专业。专业只能作为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.");
    }

只有在至少一所大学设有一个系的情况下,我才能创建专业。

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

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

我想知道是否有更好的更有效的方法来执行此操作,也许是通过使用一些我不熟悉的功能而不是使用变量来实现的。

1 个答案:

答案 0 :(得分: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;
    }
}

Q:可以用更少的代码进行检查吗?

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

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

(我认为...)


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

A:IMO,不。

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

  

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

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

  • 如果该系不存在,就无法为其添加专业。
  • 如果该系确实存在,您可以主修该系,当前它是否是学院的系 1

此处更大的一点是,任何数据模型都将​​具有各种数据完整性规则/约束。但这确实意味着您每次更改模型时都需要显式检查所有这些。您只需要检查更改的先决条件(例如该部门存在)和任何可能因更改而失效的约束。


1-“否”情况假设可能还有其他找到Department的方式。它可能是Department对象的单独表,或者可能是您正在创建和构建新的Department且尚未将其添加到其College中。