切换字符串的首字母和尾字母

时间:2019-02-20 22:15:37

标签: java

我正在制作一个程序,该程序将切换字符串的首字母和最后一个字母,但是当我运行它时,它只是将首字母替换为最后一个字母而已。

public static String swap(String String3) {
    //finds first & last letter of string
    String firstLetter =  String3.substring(0, 1);
    String lastLetter = String3.substring(String3.length() - 1);
    String a = String3.replace(firstLetter, lastLetter); 
    String z = a.replace(lastLetter, firstLetter );
    return z;
public static void main(String[] args){
    System.out.print("Enter your swap string: ");
    Scanner scan = new Scanner(System.in);
    String String3 = scan.nextLine();
    System.out.println(swap(String3));
    }

有人可以告诉我我在做什么错吗?

9 个答案:

答案 0 :(得分:2)

String.replace将所有出现的第一个字符替换为第二个字符。那不是你想要的。作为示例,假设文本为abc。第一个替换将导致cbc,第二个将导致aba,这是您所看到的。输入字符串abab的结果将是aaaa

您需要创建一个新的String才能获得所需的交换空间:

char first = text.charAt(0);
char last = text.charAt(text.length() - 1);
return last + text.substring(1, text.length() - 2) + last;

或者,您可以使用正则表达式:

text.replaceAll("^(.)(.*)(.)$", "$3$2$1");

如果输入文本的长度足够长,我将跳过测试,因此输入文本a将导致第一个解决方案出错。第二种解决方案仍然可以使用,因为正则表达式不匹配,也不会进行替换。

答案 1 :(得分:1)

您用a中的最后一个字母替换了第一个字母,因此当您在z中查找该字母时,没有实例可以替换。还将替换a中最后一个字母的任何实例。

一种方法是将String3子字符串化,并在所需的字符前添加/添加

public static String swap(String String3) {
   //finds first & last letter of string
   String firstLetter =  String3.substring(0, 1);
   String lastLetter = String3.substring(String3.length() - 1);

   String3 = firstLetter + String3.substring(1);
   String3 = String3.substring(0, String3.length() - 1) + lastLetter;
   return String3;
}

public static void main(String[] args){
   System.out.print("Enter your swap string: ");
   Scanner scan = new Scanner(System.in);
   String String3 = scan.nextLine();
   System.out.println(swap(String3));
}

答案 2 :(得分:0)

您用第一个字母替换了第一个字母,所以现在第一个字母和最后一个字母相等。然后,您用第一个(与最后一个相等)替换了最后一个,因此第一个和最后一个相等。

答案 3 :(得分:0)

第一次替换后,您在第一个和最后一个位置都带有lastLetter的字符串。

String a = String3.replace(firstLetter, lastLetter);    // LASTxxxxLAST

第二次替换后,您显然在这里firstLetter

String z = a.replace(lastLetter, firstLetter );    // FIRSTxxxxFIRST

为避免这种情况,请尝试交换第一次替换和第二次替换,并使用带有replaceAll符号的$和第二次替换的replaceFirst

...
String z = String3.replaceAll(lastLetter + "$", firstLetter);
String a = z.replaceFirst(firstLetter, lastLetter);
return a;

答案 4 :(得分:0)

String3 = String3.substring(String3.length() - 1) +    // last
          String3.substring(1,String3.length() - 2) + // middle
          String3.substring(0, 1);    // first

答案 5 :(得分:0)

例如使用“ abc”作为输入, 如果您调试代码,则会发现错误-最后一次替换之前的字符串为“ cbc”,而您将“ c”替换为“ a”。...因此结果

    String firstLetter = String3.substring(0, 1);//a
    String lastLetter = String3.substring(String3.length() - 1);//c
    String a = String3.replace(firstLetter, lastLetter);//cbc
    String z = a.replace(lastLetter, firstLetter);//aba

答案 6 :(得分:0)

解决方案中的问题是以下两行:

    String a = str.replace(firstLetter, lastLetter); // 1
    String z = a.replace(lastLetter, firstLetter); // 2

String.replace(char oldChar, char newChar)返回一个新字符串,该字符串是用oldChar替换了该字符串中newChar的所有 的结果。因此,当您创建String a时,将等于firstLetter的所有字符替换为等于lastLetter的字符。

让我们以字符串“ abbbabbb”作为输入进行分析:

  • 执行第1行后,您将获得“ bbbbbbbb”-所有ab取代
  • 在执行第2行之后,将没有任何效果,因为您尝试单独替换字母(在示例中,将b输入为b,因此无效)。

一种可行的解决方案如下:

import java.util.Scanner;

class Answer {

  public static void main(String[] args){
    System.out.print("Enter your swap string: ");
    try (Scanner scan = new Scanner(System.in)) {
      String str = scan.nextLine();
      String swapped = new String(swap(str, 0, str.length() - 1));
      System.out.println(swapped);
    }
  }

  private static char[] swap(String str, int i, int j) { 
    char[] chars = str.toCharArray(); 
    char tmp = chars[i]; 
    chars[i] = chars[j]; 
    chars[j] = tmp; 
    return chars; 
  }
}

此方法的好处-它可用于交换String中的任意2个字母。

答案 7 :(得分:0)

使用流api也有相当简洁的解决方案(但不是那么快)。将输入字符串转换为字符列表,然后使用Collections.swap方法并再次返回字符串:

List<Character> list = String3.chars().mapToObj(c -> (char)c).collect(Collectors.toList());
Collections.swap(list, 0, list.size() - 1);
String result = list.stream().map(Object::toString).reduce((s1, s2) -> s1 + s2).orElse("");

答案 8 :(得分:0)

让我们看看问题的原因,并看看我解决问题的方法。

问题

下面,我在注释中描述了swap方法的代码中的一些调试:

//considering String3 is equals to something like "a---z"
public static String swap(String String3) {
    System.out.println(String3);

    //this stores "a" value
    String firstLetter = String3.substring(0, 1);
    System.out.println("first: " + firstLetter);

    //this stores "z" value
    String lastLetter = String3.substring(String3.length() - 1);
    System.out.println("last: " + lastLetter);

    /*
    this replaces in the String3 source the character which is
    equals to firstletter (= "a" value) for lastLetter (= "z" value)

    the String3 field, which is "a-z" is turned to "z-z"

    Then, the final value stored is "z-z" 
     */
    String a = String3.replace(firstLetter, lastLetter);
    System.out.println("a: " + a);

    /*
    this replaces in the String3 source the character which is
    equals to lastLetter (= "z" value) for firstLetter (= "a" value)

    the a field, which is "z-z" is turned to "a-a"

    Then, the final value stored is "a-a" 
     */
    String z = a.replace(lastLetter, firstLetter);
    System.out.println("z: " + z);

    /*
    by returning the field z you only will get the same character 
    at start and end.
     */
    return z;
}

解决问题

我建议使用one-liner方法解决此问题,该方法使用substring()方法替换字符。看看:

/*
 * This avoid creating new fields and uses only the passed parameter.
 * 
 * - First we set the FIRST character of the s value to the LAST
 * character of the parameter;
 * 
 * - Second we concatenate this with a substring from s, which goes
 * from second character to the "semi last" (last previous);
 * 
 * - Then we can add the FIRST character at the END.
 */
public static String swapFirstAndLast(String s) {
    return s.charAt(s.length() - 1) + s.substring(1, s.length() - 1) + s.charAt(0);
}