【问题标题】:get value from hashtable where key is ArrayList<String>, and lookup is String从哈希表中获取值,其中键为 ArrayList<String>,查找为字符串
【发布时间】:2018-05-19 22:14:03
【问题描述】:

我去向哈希表发送一个字符串,并让它检查它的键(它们是 ArrayList)。如果 ArrayList 包含给定的字符串,则返回键的值。

package com;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;

public class TestMain {
    private static final String str1 = "n";
    private static final String str2 = "north";
    private static final Hashtable<ArrayList<String>,String> compassDirection = new Hashtable<ArrayList<String>,String>() {{
        put(new ArrayList<>(Arrays.asList("n", "north")), "North");
        put(new ArrayList<>(Arrays.asList("s", "south")), "South");
        put(new ArrayList<>(Arrays.asList("e", "east")), "East");
        put(new ArrayList<>(Arrays.asList("w", "west")), "West");
    }};

    public static void main(String[] args) {
        // print str1 as "North" from hashtable call
        // print str2 as "North" from hashtable call
    }
}

【问题讨论】:

  • 为什么键是一个列表?您不能调用get("n")get("north") 来查找"North" 值。如果这是您想要的,您需要添加两个条目:put("n", "North")put("north", "North")
  • 不要使用列表作为键。只需使用 HashMap&lt;String,String&gt; 并将每个值放入与它对应的键一样多的次数。
  • @Andreas 我想我会这样做作为一种解决方法。但在未来,很高兴知道我是否可以使用 ArrayList 和 Contains 作为键...尤其是在我处理大型数组时。
  • 这不是一种解决方法。它只是正确而不是错误地使用哈希表。哈希表需要知道您要查找的密钥的哈希值才能找到它。这就是哈希表工作的整个机制。如果您将列表存储为键,则需要再次提供该列表以进行查找,因为没有它,您将不知道正确的哈希值。
  • @FiddleFreak 不,你不能那样做。这不是地图的工作方式。

标签: java string arraylist hashtable


【解决方案1】:

我想我现在使用的解决方法如下...

package com;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;

public class TestMain {
    private static final String str1 = "n";
    private static final String str2 = "north";
    private static final Hashtable<String,String> compassDirection = new Hashtable<String,String>() {{
        put("n", "North");
        put("north", "North");
        put("s", "South");
        put("south", "South");
        put("e", "East");
        put("east", "East");
        put("w", "West");
        put("west", "West");
    }};

    public static void main(String[] args) {
        System.out.println(compassDirection.get(str1));
        System.out.println(compassDirection.get(str2));
    }
}

但如果知道使用 ArrayList 的问题是否可行仍然会很高兴。

【讨论】:

  • 这不是一个解决方法。这是使用Map 的唯一方法,因为您必须提供完整密钥 才能进行查找。 Map 就像一本书末尾的索引。该索引是有组织的(按字母顺序排列,类似于TreeMap 的组织方式),因此您可以快速找到一个条目。如果您尝试添加条目[Uno, One, Ein] -&gt; Page 7,您会在哪里添加它?你不能!您添加了 3 个条目:Uno -&gt; Page 7One -&gt; Page 7Ein -&gt; Page 7,因此您可以在索引中快速找到其中任何一个词。您所问的对地图的工作方式毫无意义。
【解决方案2】:

使用 Guava 的 Multimap。您可以使用 key="North" 和值 ["n", "north"] 填充它。然后在 Multimap 上调用 invert,它会为您提供另一个带有 key="n" 且值为 ["North"] 和 key ="north" 且具有值 = ["North"] 的地图。这使您可以输入所需格式的值,然后从中生成一个地图,让您可以按照自己的意愿进行查找。

或者输入与上述类似的值,但使用

 Map<String, List<String>>

并编写您自己的 invert 方法,该方法返回一个

Map<String, String>. 

【讨论】:

  • @Andreas:是的,我是。这似乎符合 OP 作为示例给出的数据。如果值不是唯一的,则任何解决方案都不起作用。
猜你喜欢
  • 2014-01-24
  • 2022-10-17
  • 1970-01-01
  • 2013-07-07
  • 2013-08-28
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多