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