【问题标题】:Optimized way to filter values in Map优化 Map 中过滤值的方法
【发布时间】:2019-08-08 13:31:54
【问题描述】:

我的地图具有与用户关联的属性,例如

user : {name=tom, address=usa, id=111, contact=7869989556, 
designation=engineer}

我将有一个规则列表,这些规则将根据给​​定的键和值列表阻止垃圾用户。例如,不允许名称以 test 开头的工程师。 所以我的标准是如果 name = ^test.*$ 和 designation=engineer 阻止添加到数据库。 上述规则将来也可以扩展为其他键以及值列表。例如规则可以扩展为力学等。

在 java 中实现这一目标的最优化方法是什么?

编辑:

doNotAddUserCriteria = HashMap<String, List<String>>

以下是7777或99999开头的工程师,屏蔽他们

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
} 

此外,我应该能够根据配置应用选定的规则。像机械师但不是工程师,名称以 7777 等开头。 如果我添加如下内容,它将阻止工程师和机械师,但我不想要

doNotAddUserCriteria.put("name", ['^9999.*$','^7777.*$'])
doNotAddUserCriteria.put("designation", ['enginner','mechanic']) 

【问题讨论】:

  • 一个带过滤器的流,也许吧?用 Java 发布你的数据结构,我的意思是 我有一个 Map&lt;String, User&gt; 而不是 我有一个地图...User 看起来如何?您可以使用User 的方法进行过滤和许多其他选项。
  • 当你谈到优化时,你想优化什么?计算还是记忆?因为一种可能的方法是创建自己的 Map 复制数据以实现在内存中受到惩罚的最佳时间
  • 同意 deHaar:使用流过滤器可能是最快的方法。
  • @deHaar 我已经用代码和更多细节编辑了这个问题。

标签: java collections hashmap


【解决方案1】:

为了让未来扩展成为一种实现它的好方法,请使用Predicate 的集合。所以你只需要在列表中添加更多的谓词。

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;
        }
    }
}

注意:我不明白您为什么需要地图,所以我列了一个清单。随意更改更适合您的问题的数据结构。

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多