【发布时间】:2014-08-21 23:58:35
【问题描述】:
我主要是一名 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])
字符串切片和列表拆分和连接在 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;
}
}
所以这似乎是不必要的复杂,而且从代码中可能很明显,我不明白使用数组与列表的原因和原因。从 Array 转换为 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;
}
}
我的问题是:
- 我是否有正确的直觉从使用列表切换到数组?
- 我的同事建议直接进行字符串操作是在 Java 中解决这个问题的最惯用的方法吗?
- 字符串操作方法是否比列表/数组方法更有效(内存、速度?)?
我主要对第二个问题感兴趣;我想学习像本地人而不是像 Python expat 那样编写 Java。
【问题讨论】:
标签: java string sorting substring