Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java |在hashMap条目上设置布尔表达式_Java_Hashmap_Expression_Logical Operators_Boolean Expression - Fatal编程技术网

Java |在hashMap条目上设置布尔表达式

Java |在hashMap条目上设置布尔表达式,java,hashmap,expression,logical-operators,boolean-expression,Java,Hashmap,Expression,Logical Operators,Boolean Expression,我有一个hashMap,其中包含作为键的“term”和作为值的“documents list” 例如: 我需要根据术语传递布尔表达式,并获取匹配的文档。此表达式将通过另一个字符串变量传递 例如: Java中是否有用于此类操作的函数?任何外部库也可以工作。 由于我的作业明天就要交了&这是我解决问题的最后一步,一个代码片段将对我有很大帮助。迭代映射值并找到与该值对应的所有键,以制作一个映射,其中键为例如Doc1,值为例如activities,admissions。将每个表达式表示为一个谓词,该谓词查

我有一个hashMap,其中包含作为键的“term”和作为值的“documents list”

例如:

我需要根据术语传递布尔表达式,并获取匹配的文档。此表达式将通过另一个字符串变量传递

例如:

Java中是否有用于此类操作的函数?任何外部库也可以工作。
由于我的作业明天就要交了&这是我解决问题的最后一步,一个代码片段将对我有很大帮助。

迭代映射值并找到与该值对应的所有键,以制作一个
映射,其中键为例如Doc1,值为例如activities,admissions。将每个表达式表示为一个
谓词
,该谓词查看一组术语,并决定其是否与表达式匹配

现在,


返回与术语表达式匹配的文档列表

在我看来,您希望实现布尔表达式列表元素的并集和交集。 您可以编写一个自定义方法,如

    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;
}
public Set和op(Set list 1,Set Doc){
if(list1.isEmpty()| | list2.isEmpty())
返回新的HashSet();
Set result=new HashSet();
迭代器it=list1.Iterator();
while(it.hasNext()){
Doc Doc1=it.next();
如果(列表2.contains(Doc))
结果.添加(Doc);
}
返回结果;
}
公共集合orOp(集合列表1、集合列表2){
if(list1.isEmpty())返回list2;
if(list2.isEmpty())返回list1;
Set result=new HashSet();
结果:addAll(列表1);
结果:addAll(列表2);
返回结果;
}
因此,(下午和活动)或(入学和入学)的结果表达式为

Set<Doc> doc1 = andOp(map.get("activities"), map.get("afternoon"));
Set<Doc> doc2 = andOp(map.get("admissions"), map.get("admissions"));
doc1 = orOp(doc1, doc2);
Set doc1=andOp(map.get(“活动”)、map.get(“下午”);
设置doc2=andOp(map.get(“admissions”)、map.get(“admissions”);
doc1=orOp(doc1,doc2);

操作是否固定/静态?或者它们只是一些示例,从某个文本栏输入?如果操作是固定的逻辑操作,则可以使用枚举将它们映射到相应的逻辑表达式,每次运行时表达式可能会更改。我在这里举了一个例子来解释所需的输出。如果表达式是自由文本,那么我认为您的赋值可能会有危险:(一些解决方案:您可以使用一些内存数据库(例如H2、sqlite等),您可以使用Antlr(很难做到相对快速)或者你可以自己编写一些简单的解析器/计算器,只用于AND,or,NOT。这是最后一步。因此,如果它只适用于AND,那也没关系。我可以提交,并且可以在我的其余工作中获得分数。但是如果没有最后一部分,我的作业将不完整。我认为在这里使用谓词是最简单的部分。pr中的关键点是问题是将自由文本转换为谓词chain@zolv我假设这个问题已经解决了,例如,他有一长串谓词,可以硬编码它们。
map.entrySet().stream().filter(e -> expression.test(e.getValue())).map(Entry::getKey).collect(Collectors.toList());
    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);