初学Java - 从第一个中间到最后一个,第一个中间改变字符串

时间:2017-07-04 06:55:44

标签: java string methods indexof

尝试解决需要的家庭作业问题: 更改名称,以便首先使用姓氏。 示例:" Mary Jane Lee"将返回" Lee,Mary Jane"。 如果name没有空格,则返回时不做更改。

经过一些研究后,似乎我可以用Split方法做到这一点,但我们还没有学到这一点。

事情是我已经制定了代码,它似乎在空格时起作用  并输入一个全名,但如果没有中间名或没有空格来分隔字符,我会收到错误:

输入的名称只是:Harry Smith

java.lang.StringIndexOutOfBoundsException: String index out of range: -7

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

当名字是莎拉时

这是我的代码,但我不确定如何修复它:

public class Names {
    public static String lastNameFirst(String name) {
        int firstIndex = name.indexOf(" ");
        int secondIndex = name.indexOf(" ", firstIndex + 1);
        String firstName = name.substring(0, name.indexOf(" "));
        String middleName = name.substring(firstIndex + 1, secondIndex);
        String lastName = name.substring(secondIndex + 1);
        String result = "";
        result = lastName + ", " + firstName + " " + middleName;
        return result;
    }
}     

提前致谢!!

4 个答案:

答案 0 :(得分:4)

使用分割和切换会更容易

    String name = "Mary Jane Lee";
    String arr[] = name.split (" ");

    switch (arr.length) {
        case 1:
            System.out.println(name);
            break;
        case 2:
            System.out.println(arr[1] + ", " + arr[0]);
            break;
        default:
            System.out.println(arr[2] + ", " + arr[0] + " " + arr[1]);  
    }

答案 1 :(得分:2)

更强大的方法是使用lastIndexOf查找最后一个空格:

int lastSpace = name.lastIndexOf(' ');
if (lastSpace != -1) {
  String lastName = name.substring(lastSpace + 1);
  String partBeforeLastName = name.substring(0, lastSpace);
  return lastName + ", " + partBeforeLastName;
} else {
  return name;
}

你实际上并不关心其他空间(如果它在那里),因为第一个和中间名保持相同的相对顺序。

(一般来说,有lots of falsehoods that programmers believe about names;但是为了练习的目的,我们把它们放在一边。)

答案 2 :(得分:1)

您的代码假定输入String包含至少两个空格。当这个假设是错误的(如输入“Harry Smith”和“Sarah”)时,你会得到一个例外。

在使用其值之前,您必须先检查firstIndexsecondIndex是否为正。

答案 3 :(得分:0)

问题是你的代码除了有3个名字。当名字较少时,它不会处理。

public static String lastNameFirst(String name)
{
  int firstIndex = name.indexOf(" ");
  if ( firstIndex >= 0 )
  {
    int secondIndex = name.indexOf(" ", firstIndex + 1 );
    String firstName = name.substring(0, firstIndex);
    if ( secondIndex >= 0 ) // we have 3 names
    {
      String middleName = name.substring(firstIndex + 1, secondIndex);
      String lastName = name.substring(secondIndex + 1);
      return lastName + ", " + firstName + " " + middleName; 
    }
    else // we have 2 names
    {
      String lastName = name.substring(firstIndex + 1);
      return lastName + ", " + firstName;
    }
  }
  else // have only one name
    return name;
}

也值得尝试lastIndexOf()

public static String lastNameFirst(String name)
{
  int lastIndex = name.lastIndexOf(" ");
  if ( lastIndex >= 0 ) // have at least 2 names
  {
      String firstNames = name.substring(0,lastIndex);
      String lastName = name.substring(lastIndex + 1);
      return lastName + ", " + firstNames;
    }
  }
  else // have only one name
    return name;
}

此外,可以尝试不同的方法,将名称拆分为数组,如下所示:

public static String lastNameFirst(String name)
{
  String[] parts = name.split(" ");
  switch ( parts.length )
  {
    case 1:
      return name;
    case 2:
      return parts[1] + ", " + parts[0];
    case 3:
      return parts[2] + ", " + parts[0] + " " + parts[1];
  }
}