Проверка, если несколько хэш-карт пустые - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь найти, если несколько HashMaps пустые.

Чтобы дать некоторый контекст.У меня есть объявленная здесь хэш-карта.

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, я проверяю, является ли его хэш-карта отдела пустой.Если оно пустое, то я увеличиваю количество пустых колледжей.

Затем я сравниваю количество объектов колледжа с найденными пустыми объектами колледжа, если они равны, я печатаю ошибку.

Мне было интересно, есть ли лучший, более эффективный способ сделать это, возможно, с какой-то существующей функцией, с которой я не знаком, а не с использованием переменных.

1 Ответ

1 голос
/ 05 мая 2019

В: Можете ли вы сделать проверку «более эффективно»?

A: Вы могли бы немного ее оптимизировать:

boolean nonEmptyColleges = false;

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

Вышеуказанные короткие замыкания, как только он обнаружит College с Department.Это будет существенным улучшением во многих случаях.

Затем, предполагая, что Databases.tblColleges является Map:

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());

(я думаю ...)


Q: Но этоправильный подход?

A: ИМО, нет.

Кажется, что вы собираетесь делать эту проверку каждый раз, когда добавляете мажор.Это не обязательно.

Майоры могут существовать только как атрибут Департамента.

Ключевым моментом, который вам нужно проверить, является наличие отдела, для которого вы хотите добавить мажор.

  • Если Департамент не существует, вы не можете добавить к нему мажор.
  • Если Департамент существует, вы можете получить мажор для него, независимо от того, существует он или нет.в настоящее время это факультет колледжа 1 .

Здесь важнее то, что любая модель данных будет иметь различные правила / ограничения целостности данных.Но это означает, что вам нужно явно проверять их все при каждом изменении модели.Вам нужно только проверить предварительные условия для изменения (например, наличие Департамента) и любые ограничения, которые могут быть признаны недействительными в результате изменения.


1 - в случае «не» предполагается, чтоможет быть какой-то другой способ найти Department.Это может быть отдельная таблица из Department объектов, или это может быть то, что вы находитесь в процессе создания и создания нового Department и еще не добавили его в College.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...