繁体   English   中英

如何在Java中使用for循环和if语句将字符串中的每个字母加倍

[英]How do you double each letter in a string using a for loop and an if statement in java

我需要使用for循环和if-then语句将字符串中的每个字母加倍。 如何梳理字符串并测试每个字符是字母还是符号(例如感叹号)? 然后将字符串打印出来,每个字母加倍,每个感叹号加倍。

到目前为止,这就是我所拥有的。 它尚未完成,根本无法使用,但是我走在正确的轨道上吗?

import java.util.Scanner;

public class DoubleLetters{
  public static void main(String[] args){
  Scanner scan = new Scanner(System.in);

  System.out.println("Enter a sentence:");
  String sentence = scan.nextLine();

  boolean isLetter = false;

  for (int i = 0; i < sentence.length(); i++){
    isLetter = Character.isLetter(sentence.charAt(i));
    if (i == sentence.length() || sentence.charAt(i) == ' ' || isLetter == false){
    System.out.print(sentence.charAt(i) + sentence.charAt(i));
  }
}

看来您走的路正确,然后通过正确的出口,然后走错路。

for (int i = 0; i < sentence.length(); i++){ [...] }是迭代字符串字符的正确方法。

Character.isLetter(c)是检查字符是否为字母的正确方法。

但是,您的情况很混乱:

  • 您为什么要为空格和结束符设置特殊条件?
  • 为什么您的isLetter条件无效?

我认为您的情况应该只是

if (isLetter) { /* print twice */ } 
else if (isExclamationPoint) { /* print "thrice" */ }
else { /* print once */ }

尝试这个:

    import java.util.*;

    public class DoubleLetters{
      public static void main(String[] args){
          Scanner scan = new Scanner(System.in);

          System.out.println("Enter a sentence:");
          String sentence = scan.nextLine();

          StringBuilder sb = new StringBuilder();
          for (Character c: sentence.toCharArray()){
            sb.append(c);

            if(Character.isLetter(c)){
                sb.append(c);
            }
            else if(c == '!'){
                sb.append(c).append(c);
            }
          }
          sentence = sb.toString();
          System.out.println(sentence);
      }
    }

在处理这样的字符串时,最好使用StringBuilder ,它会分配给定大小的连续字符缓冲区。 您可以计算输出String需要多大,然后在构造时将此大小传递给StringBuffer

我还建议您继续调用String.charAt以获得最大效率。

您可能还希望将例程封装在一个函数中。 您可以将输入作为CharSequence获得最大效用。

public class DoubleLetters {
    private static int getRepetitionCount(char c) {
        if (Character.isLetter(c)) {
            return 2;
        } else if (c == '!') {
            return 3;
        } else {
            return 1;
        }
    }

    public static String doubleLetters(CharSequence in) {
        int inLength = in.length();
        int outLength = 0;

        for (int i = 0; i < inLength; ++i) {
            outLength += getRepetitionCount(in.charAt(i));
        }

        StringBuilder out = new StringBuilder(outLength);

        for (int i = 0; i < inLength; ++i) {
            char c = in.charAt(i);
            int reps = getRepetitionCount(c);

            for (int r = 0; r < reps; ++r) {
                out.append(c);
            }
        }

        return out.toString();
    }

    public static void main(String[] args) {
        String test = "hello! world!";
        System.out.print(doubleLetters(test));
    }
}

在这种情况下,您可以选择分配一个大小为3 * inLength的缓冲区,该缓冲区的大小足以容纳任何潜在的输出字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM