【问题标题】:Out of bounds error at keyword to alpha comparison关键字与 alpha 比较的越界错误
【发布时间】:2014-07-06 18:59:08
【问题描述】:

我正在尝试将关键字放入字符串缓冲区 alpha 并省略重复字符。我在关键字与 alpha 的比较中遇到了越界错误。

public String putKeyword(String keyword)
{
    StringBuffer alpha = new StringBuffer();

    alpha.append(keyword.charAt(0));
    for(int i = 1; i < keyword.length(); i++){
        boolean found = false;
        for(int j = 0; j < i; j++){
            if(keyword.charAt(i) == alpha.charAt(j))
                found = true;
            if(found = false)
                alpha.append(keyword.charAt(i));
        }

    }
    return alphabet = alpha.toString();
}

【问题讨论】:

  • 这里好像忘记了主要语言的标签。我假设这是 Java。
  • 我已将其添加到您的问题标签中,无需添加到标题中。 ;)

标签: java string replace keyword indexoutofboundsexception


【解决方案1】:

试试:

public String putKeyword(String keyword)
{
    StringBuffer alpha = new StringBuffer();

    alpha.append(keyword.charAt(0));
    for(int i = 1; i < keyword.length(); i++){
        boolean found = false;
        for(int j = 0; j < alpha.length(); j++){
            if(keyword.charAt(i) == alpha.charAt(j))
                found = true;
        }
        if(found == false)
            alpha.append(keyword.charAt(i));
    }
    return alphabet = alpha.toString();
}

分享和享受。

【讨论】:

  • if(found = false)可以简化为if(!found)
  • 你发布的代码甚至会因为if(found = false)编译失败。此外,我认为您发布的代码和 OP 发布的代码之间没有任何区别。
  • @Rahul:添加了缺少等号。至于“有什么不同” - 不同之处在于if(found == false) alpha.append(keyword.charAt(i));j 上被拉出循环,以便在附加到目标StringBuffer 之前检查所有字符是否重复。
  • @Rahul:有时间再考虑一下,我才意识到j 循环上的比较是问题所在。尽管如此,我还是更喜欢@Lopina 提出的解决方案,并对此表示赞同。分享和享受。
【解决方案2】:

想象一下这种情况:

keyword = "aaaaa"'

让我们遍历你的算法:

alpha = "a"

注意alpha的内容是什么

i=1, j=0  

keyword.charAt(1) == alpha.charAt(0)
一个==一个
阿尔法 = “一个”

i=2, j=0  

keyword.charAt(2) == alpha.charAt(0)
一个==一个
阿尔法 = “一个”

i=2, j=1  

由于 alpha 只有 1 个字符,因此会抛出异常,因为您正在尝试访问第二个元素。

解决方案:使用 HashSet 保持可见状态。

public String putKeyword(String keyword) {
    StringBuffer alpha = new StringBuffer();
    Set<Character> seenChars = new HashSet<String>();

    for (int i = 0; i < keyword.length(); i++) {
        char c = keyword.charAt(i);

        if (!seenChars.contains(c)) {
            seenChars.add(c);
            alpha.append(c);
        }
    }

    return alpha.toString();
}

【讨论】:

  • 这是一个很好的解释,但您可以编辑帖子。如果您这样做,将会 +1。
  • 完成 :) 我格式化了文本并使用 Set 添加了一个解决方案。
  • 然后在店内为你 +1。
【解决方案3】:

请注意,数组索引从零开始,但您的第一个 for 循环从 1 开始,而第二个从 0 开始。看起来这不是循环的意图。

【讨论】:

  • 我相信 OP 的部分代码是正确的。如果您注意到,keyword(0) 处的元素首先被添加到目标 StringBuffer (alpha.append(keyword.charAt(0));) - 然后代码循环 i 从 1 开始,因为第 0 个元素已被复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2016-04-12
  • 2017-09-23
相关资源
最近更新 更多