交换第一次出现的字母'的位置;a';最后一次出现字母';o';JAVA
任务要求我从字符串中进行转换,例如“aaligatoor”, 输出如:“oaligatoar” 我找到了如下解决方案:交换第一次出现的字母'的位置;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")) {
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 Asoword.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;
}