AdamK
AdamK

Reputation: 74

Multiply single character by given number in String

I have one goal:

1) Multiply character in String n-times (character, String, n [int] - from user input)
Example:

User input1 (String) : future
User input2 (char) : u
User input3 (int) : 2
Output: fuutuure

First i tried with char[] array but IndexOutOfBoundsException brought me back to reality. Second try-StringBuilder but its not working aswell-empty result window. Should I use StringBuilder (and if answer is yes-how?) ? Or there is other, better solution.
Thank you for help.

package Basics.Strings;

import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Ex4 {

static String giveAWord() {
    Scanner scanWord = new Scanner(System.in);
    System.out.println("Give a word");
    String word = scanWord.nextLine();
    return word;
}

static char giveALetter() {
    Scanner scanALetter = new Scanner(System.in);
    System.out.println("Give a letter");
    char let = scanALetter.next().charAt(0);
    return let;
}

static int giveANumber() {
    Scanner scanNumber = new Scanner(System.in);
    System.out.println("Give a number");
    int numb = scanNumber.nextInt();
    return numb;
}

static String multiplyLetter(String word, char letter, int number) {

    StringBuilder sb= new StringBuilder();

    for (int i = 0; i < sb.length(); i++) {
      if (sb.charAt(i)==letter) {
    sb.append(i*number);
      }
    }
    return sb.toString();
}


public static void main(String[] args) {
    String word = giveAWord();
    char letter = giveALetter();
    int number = giveANumber();
    System.out.println(multiplyLetter(word, letter, number));
}
}

Upvotes: 1

Views: 804

Answers (4)

Arvind Kumar Avinash
Arvind Kumar Avinash

Reputation: 79075

A simple way to solve this problem is by using the following functions:

  1. String#join
  2. Collections#nCopies
  3. String#replace

Demo:

    import java.util.Collections;
    import java.util.Scanner;

    public class Main {
        public static void main(String[] args) {
            Scanner kb = new Scanner(System.in);
            System.out.print("Enter the string: ");
            String str = kb.nextLine();
            System.out.print("Enter the character: ");
            String ch = kb.nextLine();
            System.out.print("How many times to repeat?: ");
            int n = kb.nextInt();

            String result = str.replace(ch, String.join("", Collections.nCopies(n, ch)));
            System.out.println("Result: " + result);
        }
    }

A sample run:

    Enter the string: future
    Enter the character: u
    How many times to repeat?: 2
    Result: fuutuure

Upvotes: 0

lprakashv
lprakashv

Reputation: 1159

Java 8 functional way:

String alterString(String input, Character charMatch, int times) {
  return input.chars()
           .mapToObj(c -> (Character) c)      // converting int to char
           .flatMap(c -> {
             if (c == charMatch) {
               Character[] ca = new Character[times];
               Arrays.fill(ca, c);
               return Arrays.stream(ca); // stream of char c repeated 'times' times
             }
             return Stream.of(c);
           })
           .collect(
             // following is the string collecting using StringBuilder form stream of characters
             Collector.of(
               StringBuilder::new,
               StringBuilder::append,
               StringBuilder::append,
               StringBuilder::toString,
             );
           );
}

Upvotes: 0

Abra
Abra

Reputation: 20914

If you are using at least Java 11 (eleven) then the following will work:

String word = "future";
String letter = "u";
int count = 2;
String replacement = letter.repeat(count);
String result = word.replace(letter, replacement);

Note that only method repeat(int) was added in Java 11.
Method replace(CharSequence, CharSequence) was added in Java 5

Upvotes: 1

Mario MG
Mario MG

Reputation: 419

There are several things in your multiplyLetter method that would make it not work.

First, you have to initialise the StringBuilder using the word so:

StringBuilder sb = new StringBuilder(word) ;

Else, your StringBuilder will be empty.

Second, you should use the insert(int pos, char c) method, so you can specify where you want tthe character inserted.

And last, you can't just multiply a char and an int and get away with it. If you want to repeatedly insert a character, I think you should use a loop.

So, in summary, try:

StringBuilder sb= new StringBuilder(word);

for (int i = 0; i < sb.length(); i++) {
  if (sb.charAt(i)==letter) {
    for ( int j = 0 ; j < number ; j++ ) {
        sb.insert(i, letter);
        i++ ;
    }
  }
}

Notice I added i++ inside the loop, as sb.length() will increase with each character inserted.

Also, maybe someone more experienced can provide with a more efficient way than just using a loop.

Upvotes: 1

Related Questions