Java 拆分全名

Java 拆分全名,java,string,Java,String,例如,我有一个字符串,“John Daws Black”用空格分开,我需要把它们分成两部分,这样会有名字部分像“John Daws”和姓氏部分像“Black”。但是,前面的名字部分可以是任何长度,如“John Erich Daws Black”。我的代码可以得到最后一部分: public String getSurname(String fullName){ String part = ""; for (String retval: fullName.split(" "))

例如,我有一个字符串,“John Daws Black”用空格分开,我需要把它们分成两部分,这样会有名字部分像“John Daws”和姓氏部分像“Black”。但是,前面的名字部分可以是任何长度,如“John Erich Daws Black”。我的代码可以得到最后一部分:

public String getSurname(String fullName){
    String part = "";
     for (String retval: fullName.split(" "))
         part = retval;
         return part;
}
但是我不知道如何获取前面的部分。

只需找到最后一个空间,然后使用
子字符串()手动拆分


获取拆分后数组的最后一个元素:

    String fullName= "John Daws Black";
    String surName=fullName.split(" ")[fullName.split(" ").length-1];
    System.out.println(surName);
输出:

Black
John Daws 
编辑: 对于前部,使用子字符串:

    String fullName= "John Daws Black";
    String surName=fullName.split(" ")[fullName.split(" ").length-1];
    String firstName = fullName.substring(0, fullName.length() - surName.length());
    System.out.println(firstName );
输出:

Black
John Daws 
试试这个

public String getName(String fullName){
    return fullName.split(" (?!.* )")[0];
}

public String getSurname(String fullName){
    return fullName.split(" (?!.* )")[1];
}
//按任意大小的空格分割所有数据
最终模式whiteSpacePattern=Pattern.compile(\\s+);
最终列表splitData=whiteSpacePattern.splitAsStream(inputData)
.collect(Collectors.toList());
//创建输出,其中第一部分是除最后一个元素以外的所有元素
if(splitData.size()>1){
final int lastElementIndex=splitData.size()-1;
//连接除最后一个以外的所有名称
最后一个字符串firstPart=IntStream.range(0,lastElementIndex)。
.mapToObj(splitData::get)
.collect(收集器。连接(“”);
最终字符串结果=String.join(“),第一部分,
splitData.get(lastElementIndex));
}

以下方法对我很有效。它考虑到,如果存在中间名,则该名称将包含在名字中:

private static String getFirstName(String fullName) {
        int index = fullName.lastIndexOf(" ");
        if (index > -1) {
            return fullName.substring(0, index);
        }
        return fullName;
    }

    private static String getLastName(String fullName) {
        int index = fullName.lastIndexOf(" ");
        if (index > -1) {
            return fullName.substring(index + 1 , fullName.length());
        }
        return "";
    }

只需重新编写上面的安德烈亚斯的答案,但使用sperate方法获取名字和姓氏

    public static String get_first_name(String full_name)
    {
      int last_space_index = full_name.lastIndexOf(' ');
      if (last_space_index == -1) // single name
          return full_name;
      else
          return full_name.substring(0, last_space_index);
    }

    public static String get_last_name(String full_name)
    {
      int last_space_index = full_name.lastIndexOf(' ');
      if (last_space_index == -1) // single name
          return null;
      else
          return full_name.substring(last_space_index + 1);
    }

这里有一个我以前使用过的解决方案,它也考虑了后缀。。(末尾3个字符)

/**
*获取名字和姓氏:提取名字和姓氏的方便方法。
*
*@param-fullName
*
*@返回带有名字和姓氏的地图。
*/
公共静态映射getFirstAndLastName(字符串fullName){
Map firstAndLastName=new HashMap();
if(StringUtils.isEmpty(全名)){
抛出新的RuntimeException(“名称不能为空”);
}
字符串[]nameParts=fullName.trim().split(“”);
/*
*删除名称后缀。
*/
如果(nameParts.length>2&&nameParts[nameParts.length-1].length()2){
firstAndLastName.put(“firstName”,nameParts[0]);
firstAndLastName.put(“lastName”,nameParts[nameParts.length-1]);
}
返回firstname和lastname;
}
试试这个:

String[] name = fullname.split(" ")
if(name.size > 1){
    surName = name[name.length - 1]
    for (element=0; element<(name.length - 1); element++){
        if (element == (name.length - 1)) 
            firstName = firstName+name[element]
        else 
            firstName = firstName+name[element]+" "
    }
}
else 
    firstName = name[0]
String[]name=fullname.split(“”)
如果(name.size>1){
姓氏=姓名[name.length-1]

对于(element=0;element)像您正在做的那样拆分字符串,反转字符串,取反转数组中的第一个元素,即您的姓氏。之后,剩下的可以是您的姓氏,因为似乎中间名不重要。@Habil Ganbaril如果名称是“John Erich Daws Black”,对你有什么期望?乔瓦尼·多斯桑托斯呢?你在乎这个人是不是“迪克·范·戴克”,他的姓是两个字吗?没有算法可以把一个名字分开。@user3437460因为这与给定的示例略有不同,它将是两个字符串:
“John Erich Daws”
“Black”
不是对“但我不知道如何获取前端”这一真正问题的回答。谢谢你,但我只需要将前端弄乱
姓氏
部分。不应该是
[0]
@Andreas,你是对的,我在试图更正我的答案时很匆忙,答案被再次编辑,谢谢,否决票被删除。我恐怕不能用我的赞成票来认可这个答案,即使它产生了正确的结果,因为这是获得这些结果的第二个最低效的方法。现在正在构建的被删除的答案但是,在循环中使用
String=String+String
的名字确实会为最低效的名字赢得价格。简单的
lastIndexOf(“”)
会快得多。非常感谢:)回答得好谢谢
String[] name = fullname.split(" ")
if(name.size > 1){
    surName = name[name.length - 1]
    for (element=0; element<(name.length - 1); element++){
        if (element == (name.length - 1)) 
            firstName = firstName+name[element]
        else 
            firstName = firstName+name[element]+" "
    }
}
else 
    firstName = name[0]