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