将单个字符乘以字符串中给定的数字

问题描述 投票:0回答:4

我有一个目标:

1]将字符乘以字符串n次(字符,字符串,n [int]-来自用户输入)例如:

用户输入1(字符串):将来 用户输入2(字符):u 用户输入3(整数):2 输出:fuutuure

[首先,我尝试使用char []数组,但是IndexOutOfBoundsException使我回到了现实。第二个try-StringBuilder,但是它不工作以及空结果窗口。我应该使用StringBuilder(如果答案是肯定的,怎么办?)?或者还有其他更好的解决方案。谢谢您的帮助。

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));
}
}
java arrays string
4个回答
1
投票

multiplyLetter方法中有几件事会使它无法正常工作。

First,您必须使用以下单词来初始化StringBuilder

StringBuilder sb = new StringBuilder(word) ;

否则,您的StringBuilder将为空。

第二,应该使用insert(int pos, char c)方法,以便可以指定要在何处插入字符。

last,您不能只将charint相乘就可以了。如果您想重复插入一个字符,我认为您应该使用循环。

因此,总而言之,尝试:

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

注意,我在循环内添加了i++,因为插入的每个字符都会增加sb.length()

此外,也许更有经验的人可以提供比仅使用循环更有效的方法。


0
投票

如果您至少使用Java 11(11),则可以使用以下方法:

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

请注意,在Java 11中仅添加了方法repeat(int)。在Java 5中添加了方法replace(CharSequence, CharSequence)


0
投票

Java 8功能方式:

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

0
投票

我个人会坚持您最初的方法,即从空的StringBuilder开始,然后一次将结果构建为一个字符。唯一的变化是根据需要追加(n-1)个字符副本:

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

  StringBuilder sb = new StringBuilder();  
  for(char c : word.toCharArray())
  {
    sb.append(c);
    if(c == letter) 
    {
        for(int i=1; i<number; i++) sb.append(c);
    }
  }
  return sb.toString();
}

[使用单词的副本初始化StringBuilder并使用insert的过程比所需的更为复杂,并且由于每次必须向右移动字符而使性能稍差一些。

© www.soinside.com 2019 - 2024. All rights reserved.