Java中的惯用语"First Last"=>"Last,First"

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)

我的问题是:

  • 我是否有正确的直觉从使用List切换到数组?
  • 我的同事建议直接字符串操作是在Java中解决这个问题的最惯用的方法吗?
  • 字符串操作方法比列表/数组方法更有效(内存,速度?)?

大多数情况下,我对第二个问题感兴趣; 我想学习像本机而不是像Python expat一样编写Java.

Kep*_*pil 5

您可以使用replaceAll()以下命令缩短范围:

public static String toLastFirst(String firstLast) {
    return firstLast.replaceAll("(.*) (.*)", "$2, $1");
}
Run Code Online (Sandbox Code Playgroud)

这应该与您的实现完全一样.如果字符串包含空格,则表达式将匹配,并切换第一个和第二个部分,然后添加一个,.如果它不包含空格,则字符串保持不变.