使用for循环和charAt();在交替的情况下打印字符串的字母

时间:2017-08-25 03:29:07

标签: java

import java.util.*;

public class BugFixes
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        altCaps("Computer Science");
    }

    static void altCaps(String hi)
    {
        String hi2 = hi;
        int locate = 0;
        for(int i = 0; i < hi2.length();i++)
        {
            if((Character.isLetter(hi2.charAt(locate))))
            {
                if(hi2.charAt(locate) % 2 == 0)
                {
                    System.out.print(hi2.toLowerCase().charAt(locate));
                    locate++;                   
                }
                else if(hi2.charAt(locate) % 2 == 1)
                {
                    System.out.print(hi2.toUpperCase().charAt(locate));
                    locate++;
                }                
            }
            else if(hi2.charAt(locate) == ' ')
            {
                System.out.print(" ");
                 locate++;
            }
        }
    }
}

这是我目前实验室遇到的问题之一。我能够解决其他一些错误,但我似乎无法找到这个错误。

我的问题是为什么输出&#34; COMPUtER SCIEnCE&#34;?我不明白这里发生了什么,我现在已经看了一个小时。我的目标是输出&#34; CoMpUtEr ScIeNcE&#34;

我认为(hi2.charAt(locate)%2 == 0)反之亦然会在字符串中的偶数和奇数位置之间交替,但我相信我在某处犯了错误。我无法找到它。

使用BlueJ V3.1.7

1年高中计算机科学经验,目前就读于AP计算机科学

任何提示?

3 个答案:

答案 0 :(得分:1)

不是真的。所以hi2.charAt(locate) % 2 == 0实际上是在检查字符的整数值是奇数还是偶数,但是你想要实际检查索引是否是奇数,或者即使我说对了。换句话说:

hi2.charAt(2) % 2 == 0

检查m是奇数还是偶数。但是,我想你想检查2(索引)是奇数还是偶数。我想从这里可以很容易地假设你需要改变:

if(hi2.charAt(locate) % 2 == 0)
   //...
else if(hi2.charAt(locate) % 2 == 1)
   //...

if(locate % 2 == 0)
   //...
else if(locate % 2 == 1)
   //...

这并不能准确地为您提供所需的输出,但这只是根据您的意愿反转if条件或身体的问题。此外,操作% 2没有其他情况,这意味着您只能获得奇数或偶数索引,因此您可以通过以下方式简化代码:

if(locate % 2 == 0)
   //...
else
   //...

哪个读得更好。希望这有帮助!

答案 1 :(得分:1)

我强烈建议重构代码以减少重复调用,并使值检查成为可能(而不是比较功能评估)。

例如:

char currentCharacter = hi2.charAt(locate);

将替换函数调用的四个实例,并允许您检查实际值是什么(而不是您期望的值)。这可能会使您的错误更加明显。

假设以下值:

hi2 = "Computer Science";
locate = 0;

然后可能值得逐步完成评估。

0. hi2.charAt(locate) % 2 == 0
1. "Computer Science".charAt(0) % 2 == 0
2. 'C' % 2 == 0
3. 67 % 2 == 0
4. 1 == 0
5. false

根本问题在于,从不将您的值分配给变量,您永远不会花时间去理解其中的内容。通过将其分配给变量,您可以使用调试器检查该值。

通过检查值,我们可以看到您可能需要0的mod,而不是'C',因此您可能想要

0. locate % 2 == 0
1. 0 % 2 == 0
2. 0 == 0
3. true

<强>加成

重构代码以减少重复,还会突出显示其他错误。例如,尝试以下操作:

assert  "CoMpUtEr sCiEnCe".equals(BugFixes.altcaps("Computer Science"));
assert  "CoMpUtEr-sCiEnCe 201".equals(BugFixes.altcaps("Computer-Science 201"));

KISS:删除不必要的逻辑可以减少出错的可能性。

答案 2 :(得分:0)

对于初学者,您不需要重新分配字符串或locate变量,或检查字符是否已经是字符。如果需要,只需使用迭代整数和参数。

其次,你要修改角色,而不是位置。

无论如何,简单的布尔切换比修改更容易理解。

void altCaps(String hi) {
    boolean caps = true;
    for (char ch : hi.toCharArray()) {
        if (ch == ' ') {
            System.out.print(ch);
        } 
        else if (Character.isLetter(ch)) {
            if (caps) System.out.print(Character.toUpperCase(ch));
            else System.out.print(Character.toLowerCase(ch));
            caps = !caps;  // switch between upper and lower every character 
        }