为了账号安全,请及时绑定邮箱和手机立即绑定

如何返回字符大小写交替形成的字符串?

如何返回字符大小写交替形成的字符串?

ABOUTYOU 2023-07-19 17:00:58
该方法应该返回通过交替指定字符串中的字符大小写形成的字符串。返回字符串中的第一个字符为小写,第二个字符为大写,第三个字符为小写,第四个字符为大写,依此类推。示例:tOrOnTo。public static String alternatingCaps(String s) {    for (int i = 0; i < s.length(); i++) {        if (i % 2 == 0) {            System.out.print(Character.toUpperCase(s.charAt(i)));        } else {            System.out.print(Character.toLowerCase(s.charAt(i)));        }    }    return s;}我希望它能起作用,但它一直未能通过 JUnit 测试。
查看完整描述

5 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

IDK,为什么所有其他解决方案都错过了一个必要条件(第一个字符必须是小写,0%2 == 0)。您的测试代码仍然会失败。


正确的解决方案是,


 public static String alternatingCaps(String s) {

    StringBuilder result = new StringBuilder();

    for (int i = 0; i < s.length(); i++) {

      if (i % 2 == 0) {

        result.append(Character.toLowerCase(s.charAt(i)));

      } else {

        result.append(Character.toUpperCase(s.charAt(i)));

      }

    }

    return result.toString();

 }

PS:交换方法调用toUpperCase和toLowerCase其他答案以获得正确的解决方案。


查看完整回答
反对 回复 2023-07-19
?
潇湘沐

TA贡献1816条经验 获得超6个赞

Java 中的字符串是不可变的,因此您无法修改它。所有修改字符串的方法都会在内部创建一个新字符串并返回它。


我认为最好的解决方案是使用StringBuilder:


public static String alternatingCaps(String str) {

    StringBuilder buf = new StringBuilder(str.length());


    for (int i = 0; i < str.length(); i++) {

        char ch = str.charAt(i);

        buf.append(i % 2 == 0 ? Character.toLowerCase(ch) : Character.toUpperCase(ch));

    }


    return buf.toString();

}


查看完整回答
反对 回复 2023-07-19
?
慕斯王

TA贡献1864条经验 获得超2个赞

您可以使用数组。


public class Main

{

    public static void main(String[] args) {

        String s = alternatingCaps("toronto");

        System.out.print(s);

    }


    public static String alternatingCaps(String s) {

        char [] array = new char[s.length()];

        for (int i = 0; i < s.length(); i++) {

            if (i % 2 == 0) {

                array[i]=Character.toUpperCase(s.charAt(i));

            } else {

                array[i]=Character.toLowerCase(s.charAt(i));

            }

        }

        return String.valueOf(array); 

    }

}


查看完整回答
反对 回复 2023-07-19
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

正如其他人所说,您实际上并没有更改返回的值,而只是打印修改后的值。


我采取了另一种方法来演示另一种在不使用模的情况下更改每个其他值的方法:


public static String alternatingCaps(String s) {

    boolean toggle = true;

    StringBuilder sb = new StringBuilder();

    for (char c : s.toCharArray()) {

        if (toggle = !toggle) {

            sb.append(Character.toUpperCase(c));

        }

        else {

            sb.append(Character.toLowerCase(c));

        }

    }

    return sb.toString();

}

这使用StringBuilder来构建返回String,并使用String.toCharArray()增强for循环来迭代所有字符而不是索引。


我们能够for在这里使用增强循环,因为我们改变了确定索引是奇数还是偶数的方式。我们不使用模数,而是使用在每次传递之间切换的值,从而有效地执行相同的操作boolean。truefalse


请注意,此方法总体上不如模方法,因为如果您想要每第三个值等,则可以轻松修改模,并且比此方法更容易阅读。这个例子主要是为了学习其他解决问题的方法。


我还避免了三元运算符,因此更容易看到切换是如何boolean工作的,尽管可以通过使用它来进一步简化。


查看完整回答
反对 回复 2023-07-19
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您不会返回已处理的String,您只是将其打印在 StdOut 上,因此输入String不会更改并且您的 jUnit 会失败。


这里使用 a StringBuilder,追加处理后的字符,最后String通过调用toString()上的方法返回StringBuilder。


public static String alternatingCaps(String s) {

    StringBuilder temp = new StringBuilder();

    IntStream.range(0, s.length()).forEach(idx ->{

        if (idx % 2 == 0) {

            temp.append(Character.toUpperCase(s.charAt(idx)));

        }else {

            temp.append(Character.toLowerCase(s.charAt(idx)));

        }

    });

    return temp.toString();

}

另一种使用Collectors#joiningandIntStream迭代输入索引的方式String应用逻辑并使用以下方式收集它Collectors#joining:


public static String alternatingCaps(String s) {

    return IntStream.range(0, s.length())

           .mapToObj(idx -> String.valueOf(idx % 2 == 0 

                           ? Character.toUpperCase(s.charAt(idx)) 

                           : Character.toLowerCase(s.charAt(idx))))

           .collect(Collectors.joining(""));

}


查看完整回答
反对 回复 2023-07-19
  • 5 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信