2

我无法理解如何使用indexOf()andsubstring()compareTo()方法将人们的名字与他们的姓氏在数组中翻转。

4

3 回答 3

2

假设您有以下内容:

String[] names = new String[]{"Joe Bloggs", "Sam Sunday"};

您可以使用以下代码交换姓氏和名字:

for (int i=0; i < names.length; i++)
{
    String someName = names[i];
    int spaceBetweenFirstAndLastName = someName.indexOf(" ");
    //These next two lines of code may be off by a character
    //Grab the characters starting at position 0 in the String up to but not including
    //   the index of the space between first and last name
    String firstName = someName.substring(0, spaceBetweenFirstAndLastName);
    //Grab all the characters, but start at the character after the space and go 
    //   until the end of the string
    String lastName = someName.substring(spaceBetweenFirstAndLastName+1);
    //Now, swap the first and last name and put it back into the array
    names[i] = lastName + ", " + firstName;
}

现在可以使用stringcompareTo方法通过将一个名称与另一个名称进行比较来对名称进行排序,因为姓氏是字符串的开头。看看这里的api ,看看你能不能弄清楚。

于 2010-04-29T19:31:47.507 回答
1

哟可以使用 split 方法将名称分隔成一个字符串数组,考虑到它们是用空格分隔的。

例如,让我们考虑一个名称:

String name = "Mario Freitas";

String[] array = name.split(" "); // the parameter is the string separator. In this case, is the space

for(String s : array){
    System.out.println(s);
}

此代码将在不同的行中打印每个名称(因为字符串是分开的)

然后,您可以使用 equals 方法比较分隔的名字和姓氏。

假设您有 2 个字符串数组,通过 split 方法获得,每个字符串都有一个不同的人名。

public void compare names(String name1, String name2){
    String array1[] = name1.split(" ");
    String array2[] = name2.split(" ");

    if(array1[0].equals(array2[0])){
        System.out.println("First names are equal");
    }

    if(array1[1].equals(array2[1])){
        System.out.println("Second names are equal");
    }
}
于 2010-04-29T19:27:23.730 回答
0

您可以使用正则表达式,特别String.replaceAll(String regex, String replacement)是重新排序名字和姓氏。

    String[] names = { "John A. Doe", "James Bond" };
    for (int i = 0; i < names.length; i++) {
        names[i] = names[i].replaceAll("(.*) (.*)", "$2, $1");
        System.out.println(names[i]);
    }

这打印:

Doe, John A.
Bond, James

但是,如果您交换的唯一原因是因为您以后想要对姓氏进行排序,那么您实际上根本不需要交换。只需将提取姓氏的代码封装到一个辅助方法中(因此它是可测试的、可重用的等),然后在您的自定义java.util.Comparator中使用它java.util.Arrays.sort

import java.util.*;

//...

static String lastName(String name) {
    return name.substring(name.lastIndexOf(' '));
}

//...

String[] names = { "John A. Doe", "James Bond" };       
Comparator<String> lastNameComparator = new Comparator<String>() {
    @Override public int compare(String name1, String name2) {
        return lastName(name1).compareTo(lastName(name2));
    }           
};
Arrays.sort(names, lastNameComparator);
for (String name : names) {
    System.out.println(name);
}

这打印:

James Bond
John A. Doe

请注意,在这两个片段中,它是空格字符的最后一个索引,用于定义名字和姓氏之间的边界。

于 2010-04-30T09:29:06.957 回答