Java 扫描字符串中的某些字符并计数

Java 扫描字符串中的某些字符并计数,java,null,Java,Null,在我的AP计算机科学课上,我们有一个作业,我需要输入一个字符串(在本例中始终是一条tweet),然后检查它是否符合字符限制,看它是否是转发,然后计算hashtag和提及的次数。我已经解决了所有这些问题,但是要计算一个标签或提及,它后面必须没有空格或返回。我目前的解决方案是: for(int i=0; i < tweetLength; i++) { if((tweet.charAt(i) == '@')&&((tweet.charAt(i+1) != 0)||(tweet

在我的AP计算机科学课上,我们有一个作业,我需要输入一个字符串(在本例中始终是一条tweet),然后检查它是否符合字符限制,看它是否是转发,然后计算hashtag和提及的次数。我已经解决了所有这些问题,但是要计算一个标签或提及,它后面必须没有空格或返回。我目前的解决方案是:

for(int i=0; i < tweetLength; i++) {
  if((tweet.charAt(i) == '@')&&((tweet.charAt(i+1) != 0)||(tweet.charAt(i+1) != 32)||(tweet.charAt(i+1) != 13)) ) {
      countMentions++;

  } if((tweet.charAt(i) == '#')&&((tweet.charAt(i+1) != 0)||(tweet.charAt(i+1) != 32)||(tweet.charAt(i+1) != 13)) ) {
      countHashtags++;

  } if(((tweet.charAt(i) == 'R')||(tweet.charAt(i) == 'r'))&&((tweet.charAt(i + 1) == 'T')||(tweet.charAt(i + 1) == 't'))&&(tweet.charAt(i + 2) == ':')) {
      retweet = true;
  }
}

我知道这是因为它试图读取null,但我找不到真正的解决方案,而且我的老师是“通过.videos进行教学”类型的,所以没有太多帮助。

在迭代字符串中的字符时,需要小心不要超出范围。您可以通过确保charAt(i)不会失败来实现这一点:

for(int i=0; i < tweetLength; i++)
    {
        if (i + 1 == tweetLength)
        {
            // avoid going out of bounds
            // when i == last char of the string
            break;
        }

        if (tweet.charAt(i) == '@')
            countMentions++;

        if (tweet.charAt(i) == '#')
            countHashtags++;

        if (i + 2 < tweetLength)
        {
            // search for i+2 only when
            // i+2 is not outside of the string
            if (((tweet.charAt(i) == 'R') || (tweet.charAt(i) == 'r')) && 
                    ((tweet.charAt(i + 1) == 'T') || (tweet.charAt(i + 1) == 't')) && 
                    (tweet.charAt(i + 2) == ':'))
            {
                retweet = true;
            }
        }
    }
for(int i=0;i
如您所见,我添加了一个break语句,以便在定位到最后一个字符时退出循环。我们也不打算检查“:”当我们在最后,但最后一个字符结束

我希望你能明白,但仅供参考,你的代码并不能“正常工作”。您还有一些不需要测试的特殊情况(例如:“ab#c”),它不是有效的标签,因此您还需要确保标签符号后面有一个有效的字母。也许还有其他人喜欢“#@abc”,但不知怎么的,你走对了路,所以我会让你做作业,而不是替你做

如果您想更好地理解引发异常的原因,请查看引发异常的代码:

public char charAt(int index) {
    if ((index < 0) || (index >= value.length)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index];
}
公共字符(int索引){
if((索引<0)| |(索引>=value.length)){
抛出新StringIndexOutOfBoundsException(索引);
}
返回值[索引];
}
现在我希望您已经理解了逻辑,请考虑修改您的,如下所示:

for(int i=0; i < tweetLength - 1; i++)
for(int i=0;i

删除第一个if。无论如何,我们都在这样做,但只是用一种更复杂的方式,对吗?:)

tweet.charAt(i+1)
——当你在字符串的末尾时,这将中断。我个人会使用正则表达式来解决类似的问题(但我想这是禁止的,因为这是学校/大学的作业?)。这里您必须首先检查
i+1
是否仍在字符串的范围内
for(int i=0; i < tweetLength - 1; i++)