Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个代码有什么问题?哈夫曼编码_Java_Algorithm_Map_Huffman Code - Fatal编程技术网

Java 这个代码有什么问题?哈夫曼编码

Java 这个代码有什么问题?哈夫曼编码,java,algorithm,map,huffman-code,Java,Algorithm,Map,Huffman Code,在这段代码中,我试图将字符串拆分为字符,并将每个字符放入映射中。如果同一个字符出现不止一次,我会在其上放置一个计数器,并将其放回映射中,增加整数(频率) 公共类频率映射{ 公共静态映射生成器映射(字符串s){ HashMap myMap=新HashMap(); //生成s中字符频率的映射 //需要将字符串分解为单个字符,对它们进行排序 //在这些频率中,然后将它们放置在地图中 对于(int i=0;i

在这段代码中,我试图将字符串拆分为字符,并将每个字符放入映射中。如果同一个字符出现不止一次,我会在其上放置一个计数器,并将其放回映射中,增加整数(频率)

公共类频率映射{
公共静态映射生成器映射(字符串s){
HashMap myMap=新HashMap();
//生成s中字符频率的映射
//需要将字符串分解为单个字符,对它们进行排序
//在这些频率中,然后将它们放置在地图中
对于(int i=0;i
这是主要的

   public static void main(String args[]){

       String str = "missisippi";

       Map frequencyMap = FrequencyMap.generateMap(str);
       HuffmanTree tree = new HuffmanTree(frequencyMap);
       Map<Character, String> encodingMap = tree.getEncodingMap();

       String encoded = tree.encode(str, encodingMap);
       System.out.println(encoded);     
   }//end of main  
publicstaticvoidmain(字符串参数[]){
字符串str=“Missippi”;
Map frequencyMap=frequencyMap.generateMap(str);
HuffmanTree树=新的HuffmanTree(frequencyMap);
Map encodingMap=tree.getEncodingMap();
字符串编码=tree.encode(str,encodingMap);
系统输出打印项次(编码);
}//干管末端
好的,有几件事

字符串是不可变的

s.substring(i);
应该是

s = s.substring(i);
虽然我还是不太清楚这到底是什么意思


第二

这些台词没有意义

myMap.put(ch, i);

if(myMap.containsKey(ch)){                   
    myMap.put(ch, myMap.get(i) + 1);                   
}
您只需添加键
ch
,然后立即询问地图是否包含
ch
——这将始终是正确的


我想你可能想把
if
-语句放在第一位,把
myMap.put(ch,1)
放在
else
-子句中。哦,还有
myMap.get(i)
可能应该是
myMap.get(ch)

您正在用字符位置初始化计数器:

myMap.put(ch, i);
在您想要的地方:

myMap.put(ch, 1);
在初始化计数器之前,您还需要检查地图中是否存在已存在的字符,增加计数器的值(使用
get(ch)
而不是
get(i)
),给出:


您的代码遇到了什么问题?行
s.substring(i)
是不可操作的。您只需快速浏览一下
s
的子字符串,然后将其丢弃<代码>s.子串(i)未更改
s
。在
char ch=s.charAt(i)之后;myMap.put(ch,i)
myMap
将始终包含
ch
的映射。你不应该在看里面之前插入任何东西。戴夫,也许你应该回去接受你以前问题的一些答案。如果人们认为你无论如何都不会看到答案,那么他们提供帮助的可能性就会降低。
myMap.put(ch, 1);
    char ch = s.charAt(i);
    //calculating the occurence of a character in a string.
    if (myMap.containsKey(ch)){                   
        myMap.put(ch, myMap.get(ch) + 1);
    } else {
        myMap.put(ch, 1);
    }//end of if statement