Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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集合,就像数据库中的表一样,具有索引和类似LINQ的查询';s_Java_Collections - Fatal编程技术网

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

如何访问java集合,就像数据库中的表一样,具有索引和类似LINQ的查询';s,java,collections,Java,Collections,这项任务在我的项目中时有发生。我需要处理一些复杂元素的集合,这些元素具有不同的属性,例如登录名、密码、哈希、角色等。我需要能够查询该集合,就像查询数据库中的表一样,只有部分数据。例如:使用角色“user”获取所有用户。或者检查是否有登录名为“root”且角色为“superuser”的用户。还需要根据相同的数据删除项目。我的第一次尝试是使用Google集合、Apache集合和lambdaj。它们都有非常相似的复制机制,但有一个很大的缺点:它是基于项集合上的一个接一个的迭代,这对于经常使用的包含大量

这项任务在我的项目中时有发生。我需要处理一些复杂元素的集合,这些元素具有不同的属性,例如登录名、密码、哈希、角色等。我需要能够查询该集合,就像查询数据库中的表一样,只有部分数据。例如:使用角色“user”获取所有用户。或者检查是否有登录名为“root”且角色为“superuser”的用户。还需要根据相同的数据删除项目。我的第一次尝试是使用Google集合、Apache集合和lambdaj。它们都有非常相似的复制机制,但有一个很大的缺点:它是基于项集合上的一个接一个的迭代,这对于经常使用的包含大量数据的集合来说是不好的。你能给我建议一些解决办法吗?谢谢

更新:


目前,我已经通过使用多个索引实现我的自定义集合解决了这个问题,这样我就可以执行直接查询:

您可以在应用程序中嵌入数据库。
是关于选择最佳嵌入式Java数据库的讨论

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

  • 他有很好的声誉
  • Java数据库包含在 JavaSE开发工具包,并且是 Sun的开发者数据库 GlassFish企业服务器。它也 他有很好的声誉
  • 是一款成熟的产品,也享有很高的声誉
      Java做不到LINQ。由于缺少lambda、
      yield
      、扩展方法和表达式树,它甚至无法实现。这家公司提供了一个穷人的替代品

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

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

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

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

      通过类似的方式,您可以优化代码以提高速度。如果您需要根据一些标准进行大量查找,您可以为此创建专门的集合。类似于数据库上的索引

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

      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));
      }
      
      public void addUser(用户){
      用户。添加(用户);
      //你的索引
      如果(!usersByRole.containsKey(user.getRole()){
      usersByRole.put(user.getRole(),new ArrayList());
      }
      usersByRole.get(user.getRole()).add(user);
      }
      公共列表findByRole(字符串角色){
      如果(!usersByRole.containsKey(角色)){
      返回collections.emptyList();
      }
      返回Collections.unmodifiablelist(usersByRole.get(role));
      }
      
      我不认为(2)更容易使用。如果你不想让SQL遍布你的代码库,你就必须定义一些好的访问器对象(DAO)。为什么不把数据也放在那里呢?