Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初学者Java-将字符串从第一个中间更改为最后一个,第一个中间_Java_String_Methods_Indexof - Fatal编程技术网

初学者Java-将字符串从第一个中间更改为最后一个,第一个中间

初学者Java-将字符串从第一个中间更改为最后一个,第一个中间,java,string,methods,indexof,Java,String,Methods,Indexof,试图解决一个家庭作业问题,要求: 更改名称,使姓氏排在第一位。 示例:“Mary Jane Lee”将返回“Lee,Mary Jane”。 如果名称没有空格,则返回时不作更改 在做了一些研究之后,我似乎可以用分割法来做这件事,但我们还没有学会 问题是我已经制定了代码,当空格 输入全名,但如果没有中间名或没有空格分隔字符,则会出现错误: 当输入的名字只是:哈里·史密斯时 java.lang.StringIndexOutOfBoundsException: String index out of r

试图解决一个家庭作业问题,要求: 更改名称,使姓氏排在第一位。 示例:“Mary Jane Lee”将返回“Lee,Mary Jane”。 如果名称没有空格,则返回时不作更改

在做了一些研究之后,我似乎可以用分割法来做这件事,但我们还没有学会

问题是我已经制定了代码,当空格 输入全名,但如果没有中间名或没有空格分隔字符,则会出现错误:

当输入的名字只是:哈里·史密斯时

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

当名字叫莎拉的时候

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

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;
    }
}     

提前谢谢

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


在使用它们的值之前,必须检查
firstIndex
secondIndex
是否为正。

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


在使用它们的值之前,必须检查
firstIndex
secondIndex
是否为正值。

使用拆分和切换会容易得多

    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]);  
    }

使用split和switch会容易得多

    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]);  
    }

更可靠的方法是使用
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;
}
实际上,您并不真正关心其他空格(如果它在那里的话),因为名字和中间名保持相同的相对顺序


(通常有;但是为了练习的目的,我们把它们放在一边。)

一种更有效的方法是使用
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;
}
实际上,您并不真正关心其他空格(如果它在那里的话),因为名字和中间名保持相同的相对顺序


(通常有;但是为了练习的目的,让我们把它们放在一边。)

问题是,您的代码中有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];
  }
}

问题是,您的代码中有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];
  }
}


使用
lastIndexOf
而不是
indexOf
查找姓氏前的空格。然后根据是否找到空间,有两个不同的输出。除了最后一个空格外,您不需要关心任何其他空格。使用
lastIndexOf
而不是
indexOf
来查找姓氏前面的空格。然后根据是否找到空间,有两个不同的输出。除了最后一个空格外,您不需要关心任何其他空格。我在最后一段代码中看到两个编译错误。编译器会告诉您。找到一个:
length
不是函数,而是属性。我在最后一段代码中看到两个编译错误。编译器会告诉您。找到一个:
length
不是函数,这是一笔财产。如果他在这里输入他的全名,他(一定)会不高兴。。。(除非他喜欢简单地叫“何塞,巴勃罗·迭戈”)。我想如果他在任何地方输入他的全名,毕加索都会筋疲力尽。@DawoodibnKareem nice:)不,他所有的朋友都知道他叫何塞,巴勃罗Diego@ScaryWombat哦,是的,编辑的评论就在5m内。但我的观点是:枚举开关中的案例不会涵盖“边缘案例”名称(这些名称总是比您想象的更常见)。如果他在这里输入他的全名,他(一定)会不高兴。。。(除非他喜欢简单地叫“何塞,巴勃罗·迭戈”)。我想如果他在任何地方输入他的全名,毕加索都会筋疲力尽。@DawoodibnKareem nice:)不,他所有的朋友都知道他叫何塞,巴勃罗Diego@ScaryWombat哦,是的,编辑的评论就在5m内。但我的观点是:列举开关中的案例并不能涵盖“边缘案例”名称(这些名称总是比你想象的更常见)。再加上一个链接谢谢!!已经学习了一周,所以完全忘记了链接的lastIndexOfplus one谢谢!!已经学了一个星期,所以完全忘了lastIndexOf