Обмен имен с использованием indexOf и substring и compareTo - PullRequest
2 голосов
/ 29 апреля 2010

У меня возникают проблемы с пониманием того, как использовать методы indexOf() и substring() и compareTo(), чтобы перевернуть имена людей с их фамилиями в массиве.

Ответы [ 3 ]

2 голосов
/ 29 апреля 2010

Допустим, у вас есть следующее:

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

Строка compareTo метод можеттеперь можно использовать для сортировки имен, сравнивая одно имя с другим, теперь, когда фамилия является началом строки.Посмотрите на API здесь и посмотрите, сможете ли вы понять это.

1 голос
/ 29 апреля 2010

Yo может использовать метод split для разделения имен в массив String, учитывая, что они разделены пробелом.

Например, давайте рассмотрим имя:

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 массива Strings, полученных методом split, и каждый из них имеет одно имя Person.

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");
    }
}
0 голосов
/ 30 апреля 2010

Вы можете использовать регулярные выражения, в частности 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

Обратите внимание, что в обоих фрагментах это последний индекс пробела, который используется для определения границы между именем и фамилией.

...