简体   繁体   中英

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

I need to double each letter in a string using a for loop and an if-then statement. How can you comb through a string and test if each character is a letter or a symbol like an exclamation point? And then print the string back out with each letter doubled and each exclamation point tripled.

This is what I have so far. It's unfinished and it doesn't work at all, but am I on the right track?

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));
  }
}

It looks like you were on the right way, then passed the right exit and carried on the wrong way.

for (int i = 0; i < sentence.length(); i++){ [...] } is a right way to iterate over a string's characters.

Character.isLetter(c) is a right way to check whether a character is a letter.

However, your condition is chaotic :

  • why would you make special conditions for spaces and end characters?
  • why is your isLetter condition negated?

I think your condition should simply be

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

Try this:

    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);
      }
    }

When manipulating strings like this, it is best to use StringBuilder , which allocates a contiguous character buffer of a given size. You can count how big your output String needs to be, and pass this size to the StringBuffer on construction.

I would also recommend continuing to call String.charAt for maximum efficiency.

You may also want to encapsulate your routine in a function. You can take the input as a CharSequence for maximum utility.

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));
    }
}

In this specific case, you could alternatively allocate a buffer of size 3 * inLength , which will be large enough to hold any potential output string.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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