代码之家  ›  专栏  ›  技术社区  ›  Illarion Kovalchuk

如何访问java集合,就像数据库中的表一样,具有索引和类似LINQ的查询

  •  1
  • Illarion Kovalchuk  · 技术社区  · 15 年前

    这个任务在我的项目中经常发生。我需要处理一些复杂元素的集合,这些元素具有不同的属性,例如login、password\u hash、role等。而且,我需要能够查询该集合,就像查询数据库中的表一样,只有部分数据。例如:get all users,角色为“user”。或者,如果有登录名为“root”且角色为“superuser”的用户,请检查。还需要基于相同的数据删除项。我的第一个尝试是使用Google集合、Apache集合和lambdaj。它们都有非常相似的复制机制,但有一个很大的缺点:它是基于迭代,一个接一个,超过了项目的集合,这是不好的,经常使用的集合,包含大量的数据。你能给我一些建议吗?谢谢。

    更新:

    http://code.google.com/p/tablej/

    3 回复  |  直到 15 年前
        1
  •  1
  •   extraneon    15 年前

    数据库也不是自动高效的;实际上,您需要配置一个数据库(通过在相关列上放置索引),使其能够高效地执行搜索。

    您不仅可以将您的用户插入到用户列表中,还可以将同一个用户放入一个映射中,例如键入角色:

    public void addUser(User user) {
        users.add(user);
        // your index
        if (!usersByRole.containsKey(user.getRole()) {
           usersByRole.put(user.getRole(), new ArrayList<User>());
        }
        usersByRole.get(user.getRole()).add(user);
    }
    
    public List<User> findByRole(String role) {
        if (!usersByRole.containsKey(role)) {
            return Collectsions.emptyList();
        }
        return Collections.unmodifieableList(usersByRole.get(role));
    }
    
        2
  •  1
  •   Marcelo Cantos    15 年前

    Java做不到LINQ。因为没有兰姆达斯,它甚至没有接近, yield ,扩展方法和表达式树。这个 quaere project 提供穷人的替代品。

    我不认为这将满足您的算法效率的要求,然而。这些只能通过以下两种方式之一来实现:

    1. 手工编码的数据结构,针对您想问的问题进行了优化。
    2. 在记忆中 HSQLDB

    前者很难,但可能会产生最好的性能。后者不会那么快,但也可以,特别是如果使用索引进行了适当的调整,而且使用起来更简单。

        3
  •  1
  •   Romain Hippeau    15 年前

    你可以在你的应用程序中嵌入一个数据库。
    Here 讨论了如何选择最佳的嵌入式Java数据库。

    下面的可能是前三名(他们都是免费的)。

    • HSQLDB
    • Java DB Java DB包含在 javase开发工具包 Sun的开发者数据库 GlassFish企业服务器。它也 有很好的声誉。
    • Berkeley DB 是一款成熟的产品,也有很高的口碑。