所以我需要有一些多字符的字符,其中添加一个重复字符会使基数增加1,并且字符的多样性不会大幅增加对象占用的内存。
这将通过某种地图实现,其中字符是键,其中包含表示该字符在集合中表示的数字的值。
然而,我正在努力弄清楚哪个集合最适合这个(我正在查看hashmap)以及如何声明这种数据类型。我正在做这样的事情
Map m = new HashMap(char, int);
但以上是一个不正确的声明,我不确定如何正确处理这个问题。
答案 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);
保持简单。