"Last, First"-6ren"> "Last, First"-我主要是一名Python程序员,正在学习一些Java。我需要一个函数将包含“First Last”形式的名称的字符串转换为“Last, First”(我还需要它能够处理单个名称:“Cher”=>“Ch-6ren">
gpt4 book ai didi

java - Java 中的惯用 "First Last"=> "Last, First"

转载 作者:行者123 更新时间:2023-12-01 08:02:11 26 4
gpt4 key购买 nike

我主要是一名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;
}
}

所以这看起来不必要地复杂,而且从代码中很明显我不明白使用数组与列表的原因和原因。从数组转换为列表然后再转换回来确实看起来很愚蠢,所以我尝试了这个:

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 的同事,他建议他更有可能只查找最后一个空格并分割字符串,跳过整个列表/数组业务:

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 中解决此问题的最惯用的方法吗?
  • 字符串操作方法是否比列表/数组方法更有效(内存、速度?)?

我主要对第二个问题感兴趣;我想学习像本地人一样编写 Java,而不是像 Python 外籍人士一样。

最佳答案

您可以使用 replaceAll() 更短地完成此操作:

public static String toLastFirst(String firstLast) {
return firstLast.replaceAll("(.*) (.*)", "$2, $1");
}

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

关于java - Java 中的惯用 "First Last"=> "Last, First",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24510021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com