Java 地图中过滤值的优化方法
我有一个地图,它具有与用户相关联的属性,例如Java 地图中过滤值的优化方法,java,collections,hashmap,Java,Collections,Hashmap,我有一个地图,它具有与用户相关联的属性,例如 user : {name=tom, address=usa, id=111, contact=7869989556, designation=engineer} 我将有一个规则列表,根据给定的键和值列表阻止垃圾用户。e、 g不允许名称以test开头的工程师。 所以我的标准是如果name=^test.*$和designation=engineer阻止添加到DB。 上述规则将来也可以扩展到其他键,也可以扩展到值列表。e、 g.规则可扩展为力学等 在j
user : {name=tom, address=usa, id=111, contact=7869989556,
designation=engineer}
我将有一个规则列表,根据给定的键和值列表阻止垃圾用户。e、 g不允许名称以test开头的工程师。
所以我的标准是如果name=^test.*$和designation=engineer阻止添加到DB。
上述规则将来也可以扩展到其他键,也可以扩展到值列表。e、 g.规则可扩展为力学等
在java中实现这一点的最佳方法是什么
编辑:
为了在将来允许扩展,一种实现它的好方法是使用
谓词的集合。因此,您只需向列表中添加更多谓词
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class MapFilter {
public static void main(String[] args) {
User tomTheEngineer = new User("111", "tom", "usa", "7869989556", "engineer");
User martinTheManager = new User("112", "tom", "india", "234234", "manager");
User billTheTester = new User("113", "billTest", "spain", "23423423", "tester");
List<User> users = Arrays.asList(tomTheEngineer, martinTheManager, billTheTester);
List<Predicate<User>> allPredicates = new ArrayList<>();
allPredicates.add(user -> !user.name.endsWith("Test"));
allPredicates.add(user -> !user.designation.equals("engineer"));
List<User> filteredUsers = users.stream()
.filter(allPredicates.stream().reduce(x -> true, Predicate::and))
.collect(Collectors.toList());
assert(filteredUsers.size() == 1 && filteredUsers.contains(martinTheManager));
}
static class User {
String id;
String name;
String address;
String contact;
String designation;
public User(String id, String name, String address, String contact, String designation) {
this.id = id;
this.name = name;
this.address = address;
this.contact = contact;
this.designation = designation;
}
}
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.function.Predicate;
导入java.util.stream.collector;
公共类映射过滤器{
公共静态void main(字符串[]args){
用户tomTheEngineer=新用户(“111”、“tom”、“usa”、“7869989556”、“engineer”);
用户martinTheManager=新用户(“112”、“tom”、“india”、“234234”、“manager”);
用户billTheTester=新用户(“113”、“billTest”、“西班牙”、“23423423”、“测试仪”);
List users=Arrays.asList(工程师、Martin经理、billTheTester);
List allPredicates=new ArrayList();
allPredicates.add(user->!user.name.endsWith(“Test”);
allPredicates.add(user->!user.designation.equals(“工程师”);
List filteredUsers=users.stream()
.filter(allPredicates.stream().reduce(x->true,谓词::and))
.collect(Collectors.toList());
断言(filteredUsers.size()==1&&filteredUsers.contains(martinTheManager));
}
静态类用户{
字符串id;
字符串名;
字符串地址;
弦接触;
字符串名称;
公共用户(字符串id、字符串名称、字符串地址、字符串联系人、字符串名称){
this.id=id;
this.name=名称;
this.address=地址;
this.contact=contact;
这个名称=名称;
}
}
}
注:我不明白你为什么需要一张地图,所以我列了一张清单。请随意更改更适合您的问题的数据结构。可能是带过滤器的流?用Java发布您的数据结构,我的意思是我有一个Map
而不是一个Map。。。用户的样子如何?您可以使用User
的方法进行过滤和许多其他选项。当您谈论优化时,您想要优化什么?计算还是记忆?因为一种可能的方法是创建自己的地图,复制数据,以达到最佳的记忆惩罚时间。Reed with deHaar:使用流过滤器可能是最快的方法。@deHaar我用代码和更多细节编辑了这个问题。
doNotAddUserCriteria.put("name", ['^9999.*$','^7777.*$'])
doNotAddUserCriteria.put("designation", ['enginner'])
if(isValidUser(userData)){
Process if valid else drop
}
public boolean isValidUser(Map<String,Object> userData) {
Logic should be applied here to check whether user is valid based on criteria
}
doNotAddUserCriteria.put("name", ['^9999.*$','^7777.*$'])
doNotAddUserCriteria.put("designation", ['enginner','mechanic'])
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class MapFilter {
public static void main(String[] args) {
User tomTheEngineer = new User("111", "tom", "usa", "7869989556", "engineer");
User martinTheManager = new User("112", "tom", "india", "234234", "manager");
User billTheTester = new User("113", "billTest", "spain", "23423423", "tester");
List<User> users = Arrays.asList(tomTheEngineer, martinTheManager, billTheTester);
List<Predicate<User>> allPredicates = new ArrayList<>();
allPredicates.add(user -> !user.name.endsWith("Test"));
allPredicates.add(user -> !user.designation.equals("engineer"));
List<User> filteredUsers = users.stream()
.filter(allPredicates.stream().reduce(x -> true, Predicate::and))
.collect(Collectors.toList());
assert(filteredUsers.size() == 1 && filteredUsers.contains(martinTheManager));
}
static class User {
String id;
String name;
String address;
String contact;
String designation;
public User(String id, String name, String address, String contact, String designation) {
this.id = id;
this.name = name;
this.address = address;
this.contact = contact;
this.designation = designation;
}
}
}