所以我目前正在做一个个人项目,我制作了一个程序,试图交换给定字符串中的每2个字母。
所以我想要这样的输出:
(注意输入字符串是"abllte"(
ballet
所以我写了这个方法
public static String codeString(String input) {
String firstLetter = "";
String secoundLetter = "";
String result = "";
for(int i = 0; i < input.length()-1; i++){
for(int c = 0; c < i; c = c +2)
{
firstLetter = input.substring(c,c + 1);
secoundLetter = input.substring(c + 1, c + 2);
}
result = result + secoundLetter + firstLetter;
}
return result;
}
但我得到了这个输出:
ababllll
知道怎么解决这个问题吗?
提前谢谢!
您只需要一个循环。这适用于偶数和奇数长度的字符串。
- 首先,使用的方法返回当前修改状态的
StringBuilder
- 所以
sb.insert(i, sb.charAt(i+1))
在i+1
的i
处插入char - 因此,如果
sb
包含ab
,那么StringBuilder
现在将包含bab
- insert返回修改后的
StringBuilder
,所以现在sb.deleteCharAt(i+2)
删除第二个a
(刚刚复制的那个( - 然后重复此操作,直到交换完所有字符为止
- 由于字符的不断插入和删除,这不是很有效
for (String s : new String[] { "abcdefg", "abcdefgh" }) {
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < sb.length() - 1; i += 2) {
sb.insert(i, sb.charAt(i + 1)).deleteCharAt(i + 2);
}
System.out.println(s + " -> " + sb);
}
打印
abcdefg -> badcfeg
abcdefgh -> badcfehg
对于一个更有效的算法,这将是前进的道路。它也更加直观。
for (String s : new String[] { "abcdefg", "abcdefgh" }) {
char ch[] = s.toCharArray();
for (int i = 0; i < ch.length - 1; i+=2) {
char c = ch[i];
ch[i] = ch[i + 1];
ch[i + 1] = c;
}
String d = String.valueOf(ch);
System.out.println(s + " -> " + d);
}
此打印与上面相同。
我不确定嵌套for循环的意义是什么。只需一个循环就可以做到这一点。
public static String codeString(String input) {
String firstLetter = "";
String secoundLetter = "";
String result = "";
for(int i = 0; i < input.length()-1; i+=2){
firstLetter = input.substring(i,i+1);
secoundLetter = input.substring(i+1,i+2);
result = result + secoundLetter + firstLetter;
}
return result;
}
如果输入字符串的字符数为奇数,则必须附加额外的最后一个字符。
public static String codeString(String input) {
String firstLetter = "";
String secoundLetter = "";
String result = "";
for(int i = 0; i < input.length()-1; i+=2){
firstLetter = input.substring(i, i+1);
secoundLetter = input.substring(i+1, i+2);
result = result + secoundLetter + firstLetter;
}
if(input.length() % 2 == 1)
result += input.substring(input.length()-1, input.length());
return result;
}
您不需要嵌套循环。将外循环更改为以2
为步长,即i = i + 2
,并移除内循环。
public class Main {
public static void main(String[] args) {
System.out.println(codeString("abllte"));
}
public static String codeString(String input) {
String firstLetter = "";
String secondLetter = "";
String result = "";
for (int i = 0; i < input.length() - 1; i = i + 2) {
firstLetter = input.substring(i, i + 1);
secondLetter = input.substring(i + 1, i + 2);
result = result + secondLetter + firstLetter;
}
return result;
}
}
输出:
ballet
另一种方法:
您可以创建一个具有两个参数的函数:input
字符串作为第一个参数,n
作为第二个参数,其中input
字符串中的每个n
字符都需要反转。
public class Main {
public static void main(String[] args) {
System.out.println(codeString("abllte", 1));
System.out.println(codeString("abllte", 2));
System.out.println(codeString("abllte", 3));
System.out.println(codeString("abllte", 4));
}
public static String codeString(String input, int n) {
if (n <= input.length() / 2) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < input.length() - n + 1; i = i + n) {
result.append(new StringBuilder(input.substring(i, i + n)).reverse());
}
return result.toString();
} else {
return input;
}
}
}
输出:
abllte
ballet
lbaetl
abllte