【问题标题】:Is there an easier way for making a List in a HashMap inside another HashMap?有没有更简单的方法在另一个 HashMap 中的 HashMap 中创建列表?
【发布时间】:2019-01-01 04:00:39
【问题描述】:

我正在开发一个程序,该程序授权服务器用户使用生成的密钥访问它,我目前正在研究生成部分。服务器的所有者可以指定密钥的数量、服务器 ID 和密钥的持续时间。我需要存储并检查密钥是否与 serverID 匹配,以便用户可以使用密钥获得访问权限。

我唯一能想到的是一个复杂的 HashMap 组合,其中包含另一个 HashMap,在该 HashMap 中包含一个 List。第一个 String 是每个服务器唯一的服务器 ID,List 是生成的一批密钥,最终的 String 值是这些密钥的持续时间。

static HashMap<List<String>, String> keyTimeBundle = new HashMap<>();
static List<String> generatedKeys = new ArrayList<>();
static HashMap<String, HashMap<List<String>, String>> clientGeneratedKeys = new HashMap<>();

问题是,在检查密钥是否与匹配的服务器 ID 匹配时,我不知道从哪里开始,因为密钥位于 List 内的另一个 HashMap 中。我确信还有另一种更简单的方法来实现它,但我还没有想到它,所以请随意不使用我的方法来解释如何存储和检查值。

【问题讨论】:

  • 答案是编写自己的对象,而不是构建这些(有些荒谬的)数据结构。
  • 您正在尝试使用列表和地图创建复杂的结构。我认为最好的解决方案是创建对象来表示您需要的数据。创建一个对象服务器来存储服务器,其中包含一个密钥列表。对象 Key 可以具有生成的密钥和持续时间。这将使您的代码更易于理解。
  • 虽然它可以/应该稍微简化为Map&lt;String, Map&lt;List&lt;String&gt;, String&gt;&gt;,但您绝对应该使用您需要的方法定义一个合适的interface。请注意,使用List&lt;String&gt; 作为地图的 key 看起来特别可疑。我很难想象有一种合理的方式在那里进行查找。

标签: java list arraylist hashmap keyvaluepair


【解决方案1】:

它肯定会变得笨拙。是时候通过一些经过深思熟虑的课程来减少过度增长了。给程序中的概念起个好名字可以更容易地推理所需的逻辑和数据结构。

class Id {
    String value;
}

class Server {
    Id id;
    List<Key> keys;
}

class Key {
    Id id;
    Server server;
    Instant expirationDate;
}

每个密钥都有一个对其所在服务器的引用,每个服务器都有一个密钥列表,可以访问它。与其为密钥包分配过期时间,不如为每个密钥分配自己的过期时间。创建一批密钥只是意味着创建一堆密钥并赋予它们相同的过期时间。

Id 类可能只是对 String 的简单包装,但它使代码更易于阅读,因为您不必弄清楚 String 有什么不同(它们是 ID 吗?名字?)。 Id 这个名字清楚地表明它们是 ID 字符串。

一旦您有了自己的类,就可以更轻松地考虑需要哪些额外的数据结构。例如,您需要某种全局地图来按 ID 查找服务器。

public static Map<Id, Server> serversById;

【讨论】:

  • Id 课程走得太远了,恕我直言。但是在提出这样的解决方案时,您应该绝对说一些关于equalshashCode 的话。否则,可以预见提问者会遇到的麻烦。
【解决方案2】:

非常简单的不同方法是仅使用HashMap&lt;String,String&gt;。 你可以把钥匙当作 &lt;serverId&gt;&lt;delimiter(such as '#')&gt;&lt;generatedKey&gt; 和 value 作为该密钥在该特定服务器中的持续时间。

在搜索时,您只需连接 serverId 和 key 并检查持续时间。

【讨论】:

    【解决方案3】:

    我建议你实现一个键的 POJO 表示

    public class Key{
        private String key;
        //duration is key specific this gives you more flexibility in issuing temporary individual keys
        private long duration;
        ....
    

    然后将每个服务器密钥列表存储在地图中

    HashMap<String, List<Key>> clientGeneratedKeys = ...
    

    至于检查,你检查那个服务器的keys列表是否包含提交的key(不要忘记根据比较'key'属性来实现Key类equals)

    clientGeneratedKeys.get("Server Id").contains("submitted key");
    

    您需要在上一行代码中进行一些空安全检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多