【问题标题】:Populating a hashmap with predefined values (java)使用预定义值填充哈希图(java)
【发布时间】:2012-09-06 18:29:18
【问题描述】:

我遇到了一个以前没有处理过的问题。我正在为java中的数据库编写一个补丁,它基本上转换存储在某些行中的数据。为了做到这一点,我有一个转换表,可以告诉我什么值变成什么值。

例如,如果我读入“RC”、“AC”、“GH”-> 将值更新为“T1”。 (这些只是随机示例,它基本上是将一个字符串转换为另一个字符串。)

我需要一种存储这些转换的好方法。我在想一个哈希图: KEY,VALUE: (RC,T1) (AC,T1) (GH,T1) 以此类推。

现在,有几十个。补丁初始化时填充此哈希图的好方法是什么?

【问题讨论】:

    标签: java hashmap auto-populating


    【解决方案1】:

    我会在设置 HashMap 时进行初始化

    例如

    private static final Map<String, String> m = new HashMap<String, String>() {{
        put("RC", "T1");
        put("AC", "T1");
    }};
    

    然后,您需要确保所有内容都在您的代码中一起设置。

    我认为@Nambari 提出了一个很好的观点,尽管它可能将值作为一个列表而不仅仅是一个字符串。不过,这确实会交换您的键和值。

    例如

     private static final Map<String, List<String>> m = new HashMap<String, List<String>>() {{
        put("T1", Arrays.asList("RC", "AC");
    }};
    

    【讨论】:

    • 谢谢!这就是我的想法(你的第一个例子)。我希望可能有一种非常整洁的方式来做这件事,但我想我将不得不变得肮脏。非常感谢 RNJ 的确认。
    • @user1652875 我认为在与声明相同的位置进行初始化会稍微整洁一些。那么你肯定知道地图确实包含一些数据。
    • 警告:不要使用“双大括号初始值设定项”,它会创建 HashMap 的匿名子类,这可能会导致性能下降。其次,这让读者感到困惑,因为这段代码表明存在一些“双大括号初始值设定项”构造,而实际上并没有。
    【解决方案2】:

    在 Java 11 中,您可以使用 Map.of("RC", "T1", "AC", "T1");

    【讨论】:

      【解决方案3】:

      可能是其他方式,将RC,AC,GH列为值,将T1列为hashmap的键,这样可以减少映射中的条目数。

      【讨论】:

      • 但是,在这种结构中查找的复杂性不会有任何好处 - 那么你将如何搜索这样的地图,比如在寻找“RC”的替代品时?
      • 我同意,如果您的密钥较少(如 T1、T2 等),这是一种简单的方法。如果键较少,您可以获得 entrySet() 并使用它。如果键的数量也很高,那么查找时间会很长。同样,这是一种权衡,一个地方的简单性会在另一端产生复杂性。
      【解决方案4】:

      您可以使用来自 apache commons 的 PropertiesConfiguration

      value 可以包含值分隔符,然后将被解释为标记列表。默认值分隔符是逗号','。所以下面的属性定义

      key = This property, has multiple, values
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-04
        • 1970-01-01
        • 2014-01-31
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多