【问题标题】:Converting HashMap key values to Char Array in Java在 Java 中将 HashMap 键值转换为 Char 数组
【发布时间】:2020-08-14 14:50:48
【问题描述】:

我有以下 HashMap,我在方法中插入字符-int 对并返回此 hashmap:

HashMap<Character, Integer> hmap = new HashMap<Character, Integer>();

for (...) {
    hmap.put(string[i], number[i]); 
}

但是,当我想将此返回的 hashmap 键转换为 char 数组时,它还包括括号和逗号:

char[] charArray = myReturnedHashMap.keySet().toString().toCharArray(); 
//it returns 8 char "[ A , B , C , ]" instead of just "A B C"

那么,我该如何解决呢?

更新:另一方面,我不确定在这种情况下使用 HashMap 是否是个好主意。我有一个循环,我只需要返回 char 和 int 值对。然后在另一种方法中,我将 char 值转换为 chararray。有什么想法吗?

【问题讨论】:

  • @am0awad 我认为您没有看到注释行它返回 8 char "[ A , B , C , ]" 而不仅仅是 "ABC"
  • 这是因为您将键转换为字符串表示形式,它添加 , 和 [ ] 以获得漂亮的输出,然后在漂亮的输出之上执行 .toCharArray() 。您需要做的是迭代 keySet() 并将它们放入 char 数组中
  • 有任何 Java 开发人员有任何想法吗? :(
  • @sonnet 是否有任何通过 lambda 表达式的迭代,例如地图(m=>m....)?请问有什么例子吗?
  • 不要使用toString 方法进行转换,而是在myReturnedHashMap.keySet() 返回的Set 上使用toArray() 方法(请注意,这将为您提供Character[],但如果您愿意/需要将其转换为 char[] 我相信您可以在 SO 上找到一些解决方案。

标签: java arrays list arraylist hashmap


【解决方案1】:

这是一个简单、可重复使用(适用于所有类型的地图)且易于排序的解决方案:

char[] charArray = map.keySet().stream()
    .map(String::valueOf)
    .collect(Collectors.joining()).toCharArray();

这是最快的解决方案:

char[] chars = new char[map.size()];
int i = 0;
for (Character c : map.keySet()) {
    chars[i++] = c;
}

HashMap 中的键未排序。使用another map implementationsort the stream

【讨论】:

  • 似乎很聪明的解决方案,但不幸的是“Stream 类型中的方法 collect(Collector super Character,A,R>) 不适用于参数(Collector)" 抛出错误。有什么想法吗?
  • @hexadecimal 抱歉,我有一个Map&lt;String, String&gt;
  • 这不会创建很多不必要的字符串吗?我只是使用 for-each 循环来遍历键集(假设顺序无关紧要)。
  • @Sweeper 这是一种适用于各种地图的解决方案,允许排序并生成所需的char[] 而不是Character[]
  • @steffen 亲爱的 Steffen,我遇到了您警告过的排序错误。元素的顺序已更改,因此我需要对项目进行排序。我查看链接,但无法排序。您能否也将排序示例发布到您的答案中。我看到这是一个严重的问题。非常感谢。
【解决方案2】:

您的问题是调用 'keySet().toString()' - 这会创建地图的字符串表示形式。

我想你想要这样的东西:

Map<Character, Integer> hmap = new HashMap<Character, Integer>();
hmap.put('c', 1);
hmap.put('d', 2);
hmap.put('e', 3);

Character[] charArray = hmap.keySet().toArray(new Character[0]);

编辑:如果您需要对键进行排序,您可以使用 TreeMap 而不是 HashMap。但请注意,如果您正在处理字符并期望进行特定于语言的排序,则需要一个 Collat​​or 来在 TreeMap 中进行排序。

【讨论】:

  • 生成Character[] 而不是char[]
  • @steffen 是的,但是我得到了正确的结果,这个实现有什么问题吗?
  • @TomStroemer 对不起,但它返回异常。有什么想法吗?
  • @hexadecimal 不,解决方案很好,只要顺序无关紧要并且您的代码同时适用于char[]Character[]
  • @hexadecimal 是的,这是真的。 HashMap 不保证其键的任何顺序,但它当然不会混淆键值映射(否则整个类将无用)。
【解决方案3】:

使用toArray()

        Map<Character, Integer> map = new HashMap<Character, Integer>();
        map.put('a', 1);
        map.put('b', 1);
        Character[] charArray = map.keySet().toArray(Character[]::new);

【讨论】:

    【解决方案4】:

    您可以使用 toArray() 并注意它会返回一个 Object[] 数组。

    Object[] charArray = myReturnedHashMap.keySet().toArray();
    
    

    来自 jshell 的测试演示:

    jshell> HashMap<Character, Integer> a = new HashMap<>()
    a ==> {}
    
    jshell> a.put('a', 1)
    $11 ==> null
    
    jshell> a.keySet()
    $12 ==> [a]
    
    jshell> a.keySet().to
    toArray(     toString()   
    
    jshell> a.keySet().toArray()
    $13 ==> Object[1] { 'a' }
    
    jshell> a.keySet().toArray()[0]
    $14 ==> 'a'
    
    jshell> (char)a.keySet().toArray()[0]
    $15 ==> 'a'
    

    【讨论】:

    • 我已经尝试过了,但是在获取像 (char) charArray[0] 这样的字符值时会抛出错误。
    • 这是什么错误。我试过这个,我的似乎工作正常。
    • 我已将我的 jshell 中的演示更新为该解决方案有效的演示。
    【解决方案5】:

    toString() 在您的情况下是不必要的。你只想把Set 转换成一个数组。像这样的东西似乎工作得很好:

        HashMap<Character, Integer> hmap = new HashMap<Character, Integer>();
        hmap.put('a',1);
        hmap.put('b',1);
        hmap.put('c',1);
        Set<Character> characters = hmap.keySet();
        Character[] chars = new Character[characters.size()];
        characters.toArray(chars);
        System.out.println(Arrays.toString(chars));
    

    【讨论】:

    • @am0awad 数组只包含 3 个元素,我只是打印出来展示一下。
    猜你喜欢
    • 2013-12-02
    • 2013-10-14
    • 2011-06-08
    • 2013-12-11
    • 2011-11-19
    • 2014-03-23
    • 1970-01-01
    • 2013-06-06
    • 2016-03-10
    相关资源
    最近更新 更多