【问题标题】:StringBuffer not outputting what I expectedStringBuffer 没有输出我所期望的
【发布时间】:2018-10-17 18:14:02
【问题描述】:

我正在尝试在字符串中切换$,并将字符放在其右侧。我不允许使用char[],所以我决定使用StringBuffer。但是,当我尝试使用 H$E 之类的代码运行代码时,它会输出 HE$H$E 我不知道多余的字符是从哪里来的,我正在寻求解释。

package schrumpf.clayton.csc110.drills1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MoneyToTheRight {

static BufferedReader in;


public static void main(String[] args) throws IOException{
    in = new BufferedReader(new InputStreamReader(System.in));

    String input = in.readLine();
    int dollarIndex = input.indexOf("$");
    StringBuffer buffer =  new StringBuffer(input);
    char afterDollarChar = buffer.append(input).charAt((dollarIndex + 1));
    buffer.setCharAt(dollarIndex, afterDollarChar);
    buffer.setCharAt((dollarIndex + 1),'$');
    String result = buffer.toString();
    System.out.println(result);
    }

}

【问题讨论】:

  • 所以如果你输入“H$E”你会希望输出是“HE$”?
  • 提示:你正在调用buffer.append(input),即使你已经用input创建了StringBuffer。这就是input的内容出现两次的原因。
  • 请不要使用StringBuffer,因为它在十多年前就被StringBuilder取代了。
  • @NicholasK:以使用其线程安全的方式使用StringBuffer 是非常罕见的。 (而且这段代码当然不会。)即使您确实想要线程安全,它通常也不是基于“每次调用同步”。
  • @NicholasK 以线程安全的方式使用 StringBuffer 比它最初看起来更难,充其量也容易出错。 SimpleDateFormat 不是线程安全的,即使它是由 JDK 开发人员编写并使用 StringBuffer。

标签: java stringbuffer


【解决方案1】:

您要添加两次输入。

StringBuffer buffer =  new StringBuffer(input);
buffer.append(input)

我建议添加一次。我还建议使用十多年前取代 StringBuffer 的 StringBuilder。

Scanner in = new Scanner(System.in);

StringBuilder buffer =  new StringBuilder(in.nextLine());
int dollarIndex = buffer.indexOf("$");
buffer.setCharAt(dollarIndex, buffer.charAt(dollarIndex + 1));
buffer.setCharAt(dollarIndex + 1, '$');
System.out.println(buffer);

或单线

System.out.println(in.nextLine().replaceFirst("\\$(.)", "$1\\$"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多