Java | Представление логических выражений в записях hashMap - PullRequest
0 голосов
/ 05 мая 2018

У меня есть hashMap , который содержит "term" как key и "список документов" как значения .

Например:

KEY::VALUE
afternoon::Doc2
activities::Doc1, Doc2, Doc3
admissions::Doc1, Doc2, Doc4, Doc5
alternate::Doc5

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

Например:

(afternoon AND activities) OR alternate => Doc2, Doc5
(afternoon AND activities) OR (admissions AND alternate) => Doc2, Doc5
activities AND NOT afternoon = > Doc1, Doc3

Есть ли в Java функции для таких операций? Любые внешние библиотеки тоже будут работать. Фрагмент кода мне очень поможет, так как мое назначение должно быть завтра, и это последний шаг моего решения.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

На мой взгляд, вы хотите добиться объединения и пересечения элементов списка для логических выражений. Вы можете написать собственный метод, например

    public Set<Doc> andOp(Set<Doc> list1, Set<String> Doc) {
    if(list1.isEmpty() || list2.isEmpty())
        return new HashSet<>();

    Set<Doc> result = new HashSet<>();
    Iterator<Doc> it = list1.iterator();
    while( it.hasNext()) {
        Doc Doc1 = it.next();
        if(list2.contains(Doc))
            result.add(Doc);
    }
    return result;
}

public Set<Doc> orOp(Set<Doc> list1, Set<Doc> list2) {
    if(list1.isEmpty()) return list2;
    if(list2.isEmpty()) return list1;

    Set<Doc> result = new HashSet<>();

    result.addAll(list1);
    result.addAll(list2);
    return result;
}

Таким образом, результирующее выражение для (во второй половине дня И мероприятия) ИЛИ (входные И ИСПОЛНЕНИЯ) будет

Set<Doc> doc1 = andOp(map.get("activities"), map.get("afternoon"));
Set<Doc> doc2 = andOp(map.get("admissions"), map.get("admissions"));
doc1 = orOp(doc1, doc2);
0 голосов
/ 05 мая 2018

Выполните итерацию по значениям карты и найдите все ключи, соответствующие этому значению, чтобы получить Map<String, Set<String>>, где ключ находится, например. Doc1 и значение, например. деятельность, госпитализации. Представьте каждое выражение как Predicate<Set<String>>, которое просматривает набор терминов и решает, соответствует ли оно выражению.

Теперь

map.entrySet().stream().filter(e -> expression.test(e.getValue())).map(Entry::getKey).collect(Collectors.toList());

возвращает список документов, соответствующих выражению термина

...