在java </char,>中创建<char,int =“”>的无序映射

时间:2012-11-28 00:05:12

标签: java collections map declaration

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

这将通过某种地图实现,其中字符是键,其中包含表示该字符在集合中表示的数字的值。

然而,我正在努力弄清楚哪个集合最适合这个(我正在查看hashmap)以及如何声明这种数据类型。我正在做这样的事情

Map m = new HashMap(char, int);

但以上是一个不正确的声明,我不确定如何正确处理这个问题。

5 个答案:

答案 0 :(得分:6)

试试这个声明:

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);

答案 1 :(得分:3)

我会使用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的对象,带有向前和向后指针和指向盒装整数的指针...我会继续吗? ;)

答案 2 :(得分:1)

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);
    }
}

答案 3 :(得分:0)

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

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

这是你如何申报地图。有关更多示例和说明,请查看here

答案 4 :(得分:0)

根据我的最佳方式是使用构造函数:

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

保持简单。