惯用语" First Last" => "最后,第一"在Java中

时间:2014-07-01 12:14:46

标签: java string sorting substring

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

我的问题是:

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

我主要对第二个问题感兴趣;我想学习像本机而不是像Python expat那样编写Java。

3 个答案:

答案 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
}