Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
交换第一次出现的字母'的位置;a';最后一次出现字母';o';JAVA_Java - Fatal编程技术网

交换第一次出现的字母'的位置;a';最后一次出现字母';o';JAVA

交换第一次出现的字母'的位置;a';最后一次出现字母';o';JAVA,java,Java,任务要求我从字符串中进行转换,例如“aaligatoor”, 输出如:“oaligatoar” 我找到了如下解决方案: public static String letterReplacement(final String word) { String o = "o"; String a = "a"; if (word.contains("a") && word.contains("o")) {

任务要求我从字符串中进行转换,例如“aaligatoor”, 输出如:“oaligatoar” 我找到了如下解决方案:

public static String letterReplacement(final String word) {
            String o = "o";
            String a = "a";
            if (word.contains("a") && word.contains("o")) {
                return word.replaceFirst("a", "o")
                           .replaceFirst("(?s)(.*)" + 'o', "$1" + 'a');
            } else {
                return "Your word does not contain both of 'a' and 'o' letters, sorry...";
            }
        }
但这看起来很棘手,也许有人知道更容易理解的解决方法?
非常感谢您的帮助和关注。

查找“a”的第一个索引(
String.indexOf()
)和“o”的最后一个索引(
String.lastIndexOf()
)。如果两个索引都大于-1,则交换字母

比如:

public class StackOverflow {
    public static void main(String[] args) {
        String data = "aaligatoor";

        int firstAindex = data.indexOf("a");
        int lastOindex = data.lastIndexOf("o");

        if (firstAindex > -1 && lastOindex > -1) {
            char[] letters = data.toCharArray();
            letters[firstAindex] = 'o';
            letters[lastOindex] = 'a';

            data = new String(letters);
        }
        System.out.println(data);
    }
}
结果

oaligatoar
在空间和时间方面应该是可以的。而且它相当容易理解和理解

如果在字符串中找不到字母,则
indexOf
方法返回-1。所以我们可以检查它,只需将字母分配到
char
数组中的位置。请记住,Java中的字符串是不可变的,因此我们不能将新位置分配给原始字符串


最后,我们可以将
char
数组转换回交换的字符串。

这是我能想到的最简单的方法

public String swapAO(String s) {
    int a = s.indexOf('a');
    int o = s.lastIndexOf('o');
    if (a < 1 || o < 1) return s;
    String beforeA = s.substring(0, a);
    String between = s.substring(a + 1, o);
    String afterO = s.substring(o + 1);
    return beforeA + 'o' + between + 'a' + afterO;
}

下面是使用纯正则表达式的另一种方法:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReplaceFirstByLastPattern {

    public static void main(String[] args) {
        System.out.println(swapAByO("aaligatoor"));
    }

    public static String swapAByO(String input){

        //Pattern when a falls before o
        Pattern pattern = Pattern.compile("(a)(.*)(o)");
        Matcher matcher = pattern.matcher(input);
        if(matcher.find()){
            return matcher.replaceAll("$3$2$1");
        }

        //Pattern when o falls before a
        pattern = Pattern.compile("(.*)(o)(.*?)(a)");
        matcher = pattern.matcher(input);
        if(matcher.find()){
            return matcher.replaceAll("$1$4$3$2");
        }

        return input;
    }

如果输入中没有“o”或“a”,会发生什么?到目前为止您尝试了什么?给我们看看你的作品。所以这不是让别人帮你做作业的地方。请查看并提供一段其他人可以运行并帮助解决错误的[最小、可验证的代码]()。@Oli
if(word.contains(“a”)和&word.contains(“o”){return word.replaceFirst(“a”,“o”).replaceFirst((?s)(.*)+o,$1”+a)}else{return“您的单词不包含‘a’和‘o’两个字母,对不起……”
@kbr很抱歉,下次我会做得更好。我认为您应该试着自己找到答案,然后将其发布在这里,以便人们能给您提供他们的想法。解决您的问题的一个简单方法是使用
索引('a'))
lastIndexOf('o'))
。很好。当我切换代码时,我忘了否定这一点。这与Shar1er80在您之前1分钟发布的答案没有任何区别。这是因为我们同时在做这项工作,在他发布之前我没有刷新页面,所以我在发布我的代码之前没有看到它。太棒了,很容易理解!谢谢先生。是的h、 我相信1分钟不足以窃取别人的解决方案,也不足以更改变量名称,如果你不是flash或“波斯王子”,那么你是正确的@Leo Aso
word.replaceFirst(^([^a]*)a(.*o([^o]*)$,“$1o$2a$3”)
你的建议很好,我删除了我的答案,让你把它放在你的答案中。这将是非常有帮助的+1也是很好的答案!谢谢,先生。你的代码与初始解决方案的行为不同。在你的代码中,
oa
将被替换为
ao
,而初始解决方案保留了
oa
。不知道这是否在pur上但是,摆姿势。如果你按字面意思来做标题中的任务,那么我会说你的解决方案是正确的-如果字符串中
a
必须在
o
之前,那就不是:)很好的答案!谢谢,先生。欢迎你。请注意,在这里说“谢谢”的首选方式是向上投票好的问题和有用的答案。完成了,先生。我不能再发帖了。你能投票支持我的问题吗?
public String swapAO(String s) {
    return s.replaceFirst("^([^a]*)a(.*)o([^o]*)$", "$1o$2a$3")
}
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReplaceFirstByLastPattern {

    public static void main(String[] args) {
        System.out.println(swapAByO("aaligatoor"));
    }

    public static String swapAByO(String input){

        //Pattern when a falls before o
        Pattern pattern = Pattern.compile("(a)(.*)(o)");
        Matcher matcher = pattern.matcher(input);
        if(matcher.find()){
            return matcher.replaceAll("$3$2$1");
        }

        //Pattern when o falls before a
        pattern = Pattern.compile("(.*)(o)(.*?)(a)");
        matcher = pattern.matcher(input);
        if(matcher.find()){
            return matcher.replaceAll("$1$4$3$2");
        }

        return input;
    }