我正在制作一个程序,该程序将切换字符串的首字母和最后一个字母,但是当我运行它时,它只是将首字母替换为最后一个字母而已。
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));
}
有人可以告诉我我在做什么错吗?
答案 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”作为输入进行分析:
a
被b
取代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);
}