【问题标题】:Creating an unordered map of <char, int> in java在 java 中创建 <char, int> 的无序映射
【发布时间】:2012-11-28 00:05:12
【问题描述】:

所以我需要某种多字符集,其中添加重复字符会使基数增加 1,并且字符的多样性不应大幅增加对象占用的内存。

这将通过某种以字符为键的映射来实现,该映射包含一个值,该值表示该字符在集合中的数量。

但是,我正在努力找出最适合此的集合(我正在查看 hashmap)以及如何声明此数据类型。我正在做这样的事情

Map m = new HashMap(char, int);

但上述声明不正确,我不确定如何准确处理。

【问题讨论】:

  • 如果你可以使用第三方库,Guava 的Multiset 可能比直接的Map 更合适。
  • @LouisWasserman 我将它描述为多重集来描述我们需要适当实现的客户端视图。但是我们只能使用标准的java库和api。

标签: java collections map declaration


【解决方案1】:

试试这个声明:

Map<Character, Integer> m = new HashMap<Character, Integer>();

然后您可以像这样添加字符:

char c = //...;
if (m.containsKey(c))
    m.put(c, m.get(c) + 1);
else
    m.put(c, 1);

【讨论】:

  • 非常有帮助。有时只是很难通过 api 阅读。非常感谢。
【解决方案2】:

我将使用int[](用于ASCII)或int[][] 用于unicode 来实现它。考虑到将装箱整数存储在哈希映射中的内存占用以及使用数字引入的所有哈希冲突,并且字符只不过是数字,作为键。

public class CharacterBag {

    private int[][] data = new int[255][];

    public void add(char ch) {
        int[] bin = data[ch >> 8];
        if (bin == null) bin = data[ch >> 8] = new int[255];
        bin[ch & 0xFF]++;
    }

    public int frequency(char ch) {
        int[] bin = data[ch >> 8];
        if (bin == null) return 0;
        return bin[ch & 0xFF];
    }

}

这从零内存占用开始,并为每个 unicode 页增加 2K。通常文本使用一两个 unicode 页面中的字符。

相比之下,使用 HashMap 会产生将盒装原语存储在链表列表中的全部开销。对于每个字符,将有一个 Entry 类的对象,其中两个指针指向一个装箱键和一个链表对象,其中包含所有字段,它包含一个 Node 类的对象,带有一个前向和一个后向指针,并且具有一个指向装箱整数的指针……我要继续吗? ;)

【讨论】:

  • 看到以前的答案对这个答案的关注度很高,你想知道为什么 java 程序员的名声不好,这个答案应该在顶部
  • 对于我们这些不熟悉二进制移位和掩码的人......一旦你填充了 CharacterBag 以获得所有 w/cnt > 0 的字符,你将如何迭代它?
  • 我想我明白了...(char c = (char)((i &lt;&lt; 8)+ii);) 是我的嵌套 for 循环中的要点 (data)
【解决方案3】:
Map<Character, Integer> charCount = new HashMap<Character, Integer>();

public void addCharacter(char c) {
    Integer value = charCount.get(c);
    if (value == null) {
        charCount.put(c, 1);
    } else {
        charCount.put(c, value + 1);
    }
}

【讨论】:

    【解决方案4】:

    Java 集合不允许您创建原始类型的集合,而是应该使用它们各自的包装类(例如 int 的包装类是 Integer)。

    Map<Character,Integer> hashMap = new HashMap<Character,Integer>();
    

    这就是你声明地图的方式。更多例子和解释请看here

    【讨论】:

      【解决方案5】:

      我认为最好的方法是使用构造函数:

      Map<Key, Value> orgMap = new HashMap<Key, Value>();
      Map<Key, Value> copyMap;
      copyMap= new HashMap<Key, Value>(map);
      

      保持简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-07
        • 2015-08-27
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多