当前位置: 首页 > 知识库问答 >
问题:

链接哈希映射计数器不能正确递增

养慈
2023-03-14

尝试通过用数字替换重复字符来压缩字符串(例如,字符串aabccccaaa将变成a2blc5a3)。我试图使用链接哈希图来解决这个问题,因为需要保留输入顺序,但是我创建的计数器似乎没有正确地递增。任何见解都将不胜感激。

public class StringCompression {
    
    public static void main(String[] args) {
        
        String s = "aabcccccaaa";
        System.out.println(compString(s));
        
    }
    
    public static String compString(String str) {
        
        LinkedHashMap <Character, Integer> alphabet = new LinkedHashMap<>();
        StringBuilder strbdr = new StringBuilder();     
        
        for(int i = 0; i < str.length(); i++) {
            
            if(alphabet.containsKey(str.charAt(i))) {
                alphabet.put(str.charAt(i), alphabet.get(str.charAt(i))+1);
            }
            
            alphabet.put(str.charAt(i), 1);
        }
        
//      System.out.println(alphabet.entrySet());
        
        for(var entry : alphabet.entrySet()) {
            strbdr.append(entry.getKey());
            strbdr.append(entry.getValue());
        }
        
        return strbdr.toString();
    }
}

共有2个答案

郭远
2023-03-14
alphabet.put(str.charAt(i), 1);

不在其他语句中,并且每次都被执行

易阳朔
2023-03-14

alphabet.put(str.charat(i),1)不断重置每个值为1,您需要将其放在中,否则

for (int i = 0; i < str.length(); i++) {
    if (alphabet.containsKey(str.charAt(i))) {
        alphabet.put(str.charAt(i), alphabet.get(str.charAt(i)) + 1);
    } else {
        alphabet.put(str.charAt(i), 1);
    }
}

第一个修复会导致a5b1c5,因为地图有唯一的键,所以不能在开始时计算a,在结束时计算a

只需跟踪前面看到的字符和计数器

public static String compString(String str) {
    StringBuilder sb = new StringBuilder();
    char prev = '\0';
    int count = 0;
    for (char letter : str.toCharArray()) {
        if (prev == '\0') {
            prev = letter;
        } else if (prev != letter) {
            sb.append(prev).append(count);
            count = 0;
            prev = letter;
        }
        count += 1;
    }
    return sb.append(prev).append(count).toString();
}
 类似资料:
  • 我有一个哈希映射类型数组列表: 它的一些ID和名称如下: 这是用于循环的代码: 问题是在这一行中: 显示正确的ID和Name,如下所示: 但只有名称可用与条目: 总是返回文本“name”,它是键和返回值“Katie Bailey”。 我的问题是,为什么我不能在进入时拿到钥匙。getKey()?为什么每次迭代都要用“name”作为键?

  • 我正试图让我的头脑围绕着一个哈姆特的细节。我会用Java自己实现一个,只是为了理解。我熟悉尝试,我想我得到了HAMT的主要概念。 基本上, 两种类型的节点: null null 我不太明白的部分是碰撞检测和缓解。在链接的论文中,他暗示了这一点: 然后将现有键插入到新的子哈希表中,并添加新键。每使用5个以上的散列比特,冲突的概率就减少1/32倍。偶尔,可能会消耗整个32位哈希,必须计算一个新的哈希来

  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • > 阅读算法书,需要掌握哈希表的概念。他们写了关于使用单独链接的散列和使用线性探测的散列。我猜Java的HashMap是一个哈希表,因此我想知道HashMaps使用什么机制(链接或探测)? 我需要实现最简单的HashMap与get,put,删除。你能给我指出好的材料来阅读吗? 当用于映射的惟一键是自定义对象时,我们需要在相应的类型中实现hashCode()函数。我做得对吗?或者什么时候需要hash

  • 问题内容: 我有需要检查的情况。我有一个名为: 因为该键本身不存在,所以抛出。如果我检查 由于引发了另一个。如何测试地图中的键不存在?我知道该方法应该处理它,但这不在我的控制之下。] 问题答案: 即使现在我也因为.get引发异常而得到nullpoiner 如果只有一行,并且确定它抛出异常,则唯一的可能性可能是null。

  • 问题内容: Freemarker有两个集合数据类型,即列表和哈希图。有没有一种方法可以像对列表一样遍历哈希图键? 因此,如果我有一个带有数据的变量,则可以说: 我想用其值打印所有用户的属性。这是无效的,但目标很明确: 问题答案: 编辑: 不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其是不要使用。查看其他答案。 您使用内置的按键功能,例如,这应该可以工作: