我主要是一名Python程序员,学习一些Java。我需要一个函数来转换包含名称的字符串" First Last"进入"最后,第一" (我还需要这个能够处理单个名字:" Cher" =>" Cher"和First Middle Last:" John F. Kennedy" => ;" Kennedy,John F。")我开始考虑像在Python中那样解决它:
def tolastfirst(astring):
parts = astring.split()
return parts[-1] + ", " + " ".join(parts[:-1])
字符串切片和列表拆分和连接在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;
}
}
所以这似乎是不必要的复杂,并且从代码中可能很明显,我不明白使用数组与列表的原因和原因。从一个数组转换到一个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;
}
}
最后,我问了一位真正了解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;
}
}
我的问题是:
我主要对第二个问题感兴趣;我想学习像本机而不是像Python expat那样编写Java。
答案 0 :(得分:5)
使用replaceAll()
:
public static String toLastFirst(String firstLast) {
return firstLast.replaceAll("(.*) (.*)", "$2, $1");
}
这应该与您的实现完全一样。如果字符串包含空格,则表达式将匹配,并切换第一个和第二个部分,并添加,
。如果它不包含空格,则字符串保持不变。
答案 1 :(得分:1)
通常,当您不需要调整大小时,阵列可以更容易使用。你当然希望避免混合数组和列表,尝试使用其中一个但不要混合它们。
直接操纵是我如何解决这个问题,因为你只有两半的具体情况。 @Keppil的答案可能是最新的Java解决方案。
直接字符串操作会略微加快,因为数组/列表不需要创建,初始化,更新等。但绝对值的差异很小。
答案 2 :(得分:0)
你可以这样做:
public static String toLastFirst(String firstLast) {
//split on one ore more space chars
String[] data = firstLast.split("\\s+");
//need to check length of array etc.
return data[1] + ", " + data[0]; //build new string
}