ben*_*hor 0 java sorting string substring
我主要是一个Python程序员,学习一些Java.我需要一个函数将包含"First Last"形式的名称的字符串转换为"Last,First"(我还需要这个能够处理单个名称:"Cher"=>"Cher"和First Middle Last:"John F. Kennedy"=>"Kennedy,John F.")我开始考虑像在Python中那样解决它:
def tolastfirst(astring):
parts = astring.split()
return parts[-1] + ", " + " ".join(parts[:-1])
Run Code Online (Sandbox Code Playgroud)
字符串切片和列表拆分和连接在Python中非常常见和简洁,这是我想到的第一件事.这转化为Java这样的东西:
public static String toLastFirst(String firstLast) {
List<String> parts = Arrays.asList(firstLast.split(" "));
if (parts.size() > 1) {
String last = parts.get(parts.size() - 1);
List<String> frontParts = parts.subList(0, parts.size() - 1);
String front = org.apache.commons.lang.StringUtils.join(frontParts.toArray(), " ");
return last + ", " + front;
} else {
return firstLast;
}
}
Run Code Online (Sandbox Code Playgroud)
所以这似乎是不必要的复杂,从代码中可能很明显我不明白使用数组与列表的原因和原因.从一个数组转换到一个List然后再回来看起来真的很傻,所以我尝试了这个:
public static String toLastFirst(String firstLast) {
String[] parts = firstLast.split(" ");
if (parts.length > 1) {
String last = parts[parts.length - 1];
String[] frontParts = Arrays.copyOfRange(parts, 0, parts.length - 1);
String front = org.apache.commons.lang.StringUtils.join(frontParts, " ");
return last + ", " + front;
} else {
return firstLast;
}
}
Run Code Online (Sandbox Code Playgroud)
最后,我问了一位真正了解Java的同事,他建议他更有可能只寻找最后一个空格并切断字符串,跳过整个List/Array业务:
public static String toLastFirst(String firstLast) {
if (firstLast.indexOf(" ") != -1) {
Integer lastSpace = firstLast.lastIndexOf(" ");
String first = firstLast.substring(0, lastSpace);
String last = firstLast.substring(lastSpace, firstLast.length());
return last + ", " + first;
} else {
return firstLast;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
大多数情况下,我对第二个问题感兴趣; 我想学习像本机而不是像Python expat一样编写Java.
您可以使用replaceAll()以下命令缩短范围:
public static String toLastFirst(String firstLast) {
return firstLast.replaceAll("(.*) (.*)", "$2, $1");
}
Run Code Online (Sandbox Code Playgroud)
这应该与您的实现完全一样.如果字符串包含空格,则表达式将匹配,并切换第一个和第二个部分,然后添加一个,.如果它不包含空格,则字符串保持不变.