我想编写一个方法,它接受一个String并交换其中的每对字符,然后将它们连接成一个新的String。请让我知道如何修复此代码(或写一个更好的代码):
static String s;
public static void proc(String w) {
ArrayList k = new ArrayList();
ArrayList m = new ArrayList();
System.out.println(w.length());
int j = 0;
//test arraylist to check if string is written into arraylist
for (int i = 0; i < w.length(); i++){
k.add(w.charAt(i));
}
String p = k.get(2).toString();
System.out.println(p);
//here starts the logic of my app
for (int n = 0; n < w.length(); n++){
String v = k.get(n).toString();
if (n == 0){
m.add(1, v);
}
else if (n == 1){
m.add(0, v);
}
else if ((n % 2) == 0){
m.add(n+1, v);
}
else {
m.add(n, v);
}
}
}
public static void main(String[] args){
s = "tests";
proc(s);
}
嗨,这不是作业,而是从书中练习。无论如何使用Jon提供的代码设法独立工作 - 它可能不是那么优雅,但也使用动态大小调整来完成工作:
public static void proc(String w) {
ArrayList k = new ArrayList();
ArrayList g = new ArrayList();
String h = "";
for (int i = 0; i < w.length(); i++){
char temp = w.charAt(i);
k.add(i, temp);
}
for (int i = 0; i < w.length(); i++){
if (i == 0){
h = k.get(1).toString();
g.add(h);
}
else if (i == 1){
h = k.get(0).toString();
g.add(h);
}
else if ((i % 2) == 0){
h = k.get(i+1).toString();
g.add(h);
}
else if ((i % 2) == 1){
h = k.get(i-1).toString();
g.add(h);
}
}
System.out.println(g.toString());
}
public static void main(String[] args){
s = "test";
proc(s);
}
答案 0 :(得分:4)
我没有尝试完全了解您的代码是如何工作的,但它对我来说看起来不必要地复杂。鉴于您不需要动态调整大小,您可以使用数组更轻松地执行此操作:
public static String swapPairs(String input) {
char[] chars = input.toCharArray();
for (int i = 0; i < chars.length - 1; i += 2) {
char tmp = chars[i];
chars[i] = chars[i + 1];
chars[i + 1] = tmp;
}
return new String(chars);
}
请注意,虽然这适用于“简单”字符(其中数组的每个元素独立于其余元素),但它不会尝试将任何形式的“复合”字符转换为考虑,例如由两个UTF-16代码单元(代理对)或诸如“e +急性重音”的组合字符形成的字符。进行这种上下文感知的交换需要付出更多的努力。
答案 1 :(得分:3)
这看起来像是家庭作业,所以我将答案限制在几个提示上。
StringBuilder
中(后面跟着名为sb
)。(for i = 0; i < w.length(); i += 2)
。在这个循环中,我会做两件事:
i + 1
在字符串的范围内,我会将i + 1
个字符附加到sb
; i
个字符附加到sb
。sb.toString()
。