如何替换角色的某个实例

时间:2014-09-29 00:36:53

标签: java replace

当我想要替换它时,我不知道如何替换某个字符,它只是替换了字符串中的所有实例。我尝试了什么

String s = "thaba" //I want to replace h with a and vice versa along with b and a
for (int i; i < s.length; i++)
if (s.substring(i, i+1).equalsIngoreCase("a")) {
s = s.replace(s.substring(i, i + 1), s.substring(i - 1, i));
s = s.replace(s.substring(i - 1, i), s.substring(i, i + 1));
}

问题在于它出现了

thhbb

即使我想要它出来:

tahab

或者如果我输入

thaflar

我希望它输出

tahfalr

我知道为什么会这样,但我不知道如何让它只替换那些实例 任何帮助表示赞赏。

FIX

我的意思不同,我在上面修正了,措辞有些不正确

5 个答案:

答案 0 :(得分:1)

而不是

String s =“tha”

s.replace(“ha”,“ah”);是一种方法。

s = s.replace(h,a);将导致taa

所以当你试图用h代替所有a时,你会得到那个。

你需要同时做两个角色。

答案 1 :(得分:1)

我会编写一个方法并使用String.indexOf()String.substring()替换每个字符的第一个匹配项,例如

public static String replaceFirst(String in, char a, char b) {
    int pos1 = in.indexOf(a);
    int pos2 = in.indexOf(b);
    if (pos2 < pos1) {
        int temp = pos2;
        pos2 = pos1;
        pos1 = temp;
    }
    StringBuilder sb = new StringBuilder();
    if (pos1 != -1 && pos2 != -1 && pos1 != pos2) {
        sb.append(in.substring(0, pos1));
        sb.append(b);
        sb.append(in.substring(pos1 + 1, pos2));
        sb.append(a);
        sb.append(in.substring(pos2 + 1));
    } else {
        sb.append(in);
    }
    return sb.toString();
}

然后你可以用类似

之类的东西来调用它
public static void main(String[] args) {
    String s = "tha";
    System.out.println(replaceFirst(s, 'h', 'a'));
}

输出是请求的

tah

修改

要支持您的其他请求功能,您还必须跟踪起始位置。首先,我们可以将我们之前的方法委托给新方法,如此 -

public static String replaceFirst(String in, char a, char b) {
    return replaceFirst(in, 0, a, b);
}

然后,我们只需调用indexOf(char, int)来指定最小索引 -

public static String replaceFirst(String in, int start, char a, char b) {
    int pos1 = in.indexOf(a, start);
    int pos2 = in.indexOf(b, start);
    StringBuilder sb = new StringBuilder();
    if (pos1 != -1 && pos2 != -1 && pos1 != pos2) {
        if (pos2 < pos1) {
            int temp = pos2;
            pos2 = pos1;
            pos1 = temp;
        }
        sb.append(in.substring(0, pos1));
        sb.append(b);
        sb.append(in.substring(pos1 + 1, pos2));
        sb.append(a);
        sb.append(in.substring(pos2 + 1));
    } else {
        sb.append(in);
    }
    return sb.toString();
}

最后,我们可以用

来调用它
public static void main(String[] args) {
    String s = "afab";
    s = replaceFirst(s, 'a', 'f');
    s = replaceFirst(s, 2, 'a', 'b');
    System.out.println(s);
}

哪个输出

faba

答案 2 :(得分:0)

您可以使用占位符字母(如x)来保存&#34; a&#34;设置&#34; h&#34;值。然后设置&#34; a&#34;值为x的位置。

答案 3 :(得分:0)

你可以存储所有索引,然后逐个替换它们。

        ArrayList<Integer> aIndexes = new ArrayList<>();
        ArrayList<Integer> hIndexes = new ArrayList<>();

        // find all h's and a's
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)=='a')
                aIndexes.add(i);
            if(s.charAt(i)=='h')
                hIndexes.add(i);
        }

        // replace all a's with h's and vice versa
        for(Integer i : aIndexes)
            s  = s.substring(0,i)+'h'+s.substring(i+1);
        for(Integer i : hIndexes)
            s  = s.substring(0,i)+'a'+s.substring(i+1);

答案 4 :(得分:0)

你可以存储所有索引,然后逐个替换它们。

    ArrayList<Integer> aIndexes = new ArrayList<>();
    ArrayList<Integer> hIndexes = new ArrayList<>();

    // find all h's and a's
    for(int i=0; i<s.length(); i++){
        if(s.charAt(i)=='a')
            aIndexes.add(i);
        if(s.charAt(i)=='h')
            hIndexes.add(i);
    }

    // replace all a's with h's and vice versa
    for(Integer i : aIndexes)
        s  = s.substring(0,i)+'h'+s.substring(i+1);
    for(Integer i : hIndexes)
        s  = s.substring(0,i)+'a'+s.substring(i+1);