Java 返回一个新字符串,所有出现的输入字符都移到末尾

Java 返回一个新字符串,所有出现的输入字符都移到末尾,java,Java,我必须返回一个新字符串,将所有出现的输入字符移到末尾。我试图通过提供的字符串比较给定的字符,但无法获得预期的输出 public String moveChar(String str, char c) { int len=str.length(); String newstr=""; int m=len-1; for (int i=0; i<len; i++) { char ch1=str.charAt(i); char ch2

我必须返回一个新字符串,将所有出现的输入字符移到末尾。我试图通过提供的字符串比较给定的字符,但无法获得预期的输出

public String moveChar(String str, char c) {
    int len=str.length();
    String newstr="";
    int m=len-1;
    for (int i=0; i<len; i++) {
        char ch1=str.charAt(i);
        char ch2=str.charAt(m);
        if (ch1==c) {
            newstr=newstr+ch2;
        }
        else {
            newstr=newstr+ch1;
        }
    }
    return newstr;
}
publicstringmovechar(stringstr,charc){
int len=str.length();
字符串newstr=“”;
int m=len-1;

对于(int i=0;i,不是移动给定的字符,而是删除它-用最后一个字符替换它

您应该计算需要移位的字符数,并在末尾移位:

public String moveChar(String str, char c) {
    int len=str.length();
    String newstr="";
    int count=0;
    for (int i=0; i<len; i++) {
        char ch1=str.charAt(i);
        if (ch1==c) {
            count++;
        } else { // append only the characters that don't require shifting
            newstr=newstr+ch1;
        }
    }
    for (int i = 0; i < count; i++) { // append the characters that require shifting 
                                      // at the end
        newstr=newstr+c;
    }
    return newstr;
}

我建议您首先使用
tocharray()
将字符串获取为
char
数组,操纵数组,然后使用
new string(charArray)
将其转换回字符串

您应该通过将所有非
c
的字符复制到下一个位置来操作数组。当然,首先您要将字符复制到它们已经存在的位置,但这样做更简单。当没有要复制的字符时,您知道剩下的结果必须是所有
c
字符

以下是一种简洁的方法:

public static String moveChar(String str, char c) {
    char[] buf = str.toCharArray();
    for (int i = 0, j = 0; j < buf.length; i++)
        if (i >= buf.length)
            buf[j++] = c;       // fill
        else if (buf[i] != c)
            buf[j++] = buf[i];  // copy
    return new String(buf);
}

另一种方法是创建与字符串长度相同的新空数组,如
char[]temp=new char[word.length()]
,并根据字符是否等于所选字符从两侧填充

比如:

[iteration] -> [result array]

hello -> h????   // h != l 
^        ^       // so we add it from left
i        L

hello -> he???   // e != l 
 ^        ^      // so we add it from left
 i        L

hello -> he??l   // l == l 
  ^          ^   // so we add it from right
  i          R

hello -> he?ll   // l != l
   ^        ^    // so we add it from right
   i        R

hello -> heoll   // o != l
    ^      ^     // so we add it from left
    i      L
完成后,您可以通过
newstring(charArray)
char[]
转换为sting

现在我不会给你代码,试着自己写

如果您无法编写,请查看以下提示:

您需要两个变量,分别表示字符应放置在的
索引,具体取决于它们是否与用户选择的字符相等

在将字符放置在它们所指向的索引后,不要忘记更新这些变量(向前或向后移动)


我无法理解您的策略。使用名为
m
的变量也没有帮助。我的策略是:对于每个字符,如果不是给定的字符,则将其附加到字符串中。否则,增加一个计数器。完成后,将给定的字符附加到计数器的次数。您需要提供有关如何调用函数。例如,显示一个执行此操作的小主函数。我建议在
char[]中执行此操作
取而代之。@Andreas这也是一个很好的解决方案。这是一个紧凑的解决方案,但我不确定它的可读性。@Eran我本不打算给OP写代码。起初,我留下了前两段文字的注释。但既然你写了代码,我想我应该写一个“更好的”(无论性能如何)解决方案,然后使其紧凑,以便OP必须考虑它,即,在无法解释其工作原理的情况下,不能按原样提交代码。@Zabuza不,谢谢。我的紧凑代码不使用不必要的大括号。通常人们在发布答案时倾向于遵循官方样式指南。我特别关心ode>,对于任何初学者来说,这可能会产生问题。@Zabuza您所指的官方风格指南是哪一个?
[iteration] -> [result array]

hello -> h????   // h != l 
^        ^       // so we add it from left
i        L

hello -> he???   // e != l 
 ^        ^      // so we add it from left
 i        L

hello -> he??l   // l == l 
  ^          ^   // so we add it from right
  i          R

hello -> he?ll   // l != l
   ^        ^    // so we add it from right
   i        R

hello -> heoll   // o != l
    ^      ^     // so we add it from left
    i      L