Сортировать массив строк в алфавитном порядке по фамилии - PullRequest
2 голосов
/ 18 марта 2012

В Matlab у меня есть массив ячеек:

names = {
    'John Doe',
    'Jane Watkins',
    'Jeremy Jason Taylor',
    'Roger Adrian'
    }

Я бы хотел отсортировать их так, чтобы фамилии отображались в алфавитном порядке.В моем примере это получилось бы так:

names_sorted = {
    'Roger Adrian',
    'John Doe',
    'Jeremy Jason Taylor',
    'Jane Watkins'
    }

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

Мой вопрос: есть ли лучший способ?

Поскольку кто-то наверняка предложит вам список предположений, которые вы не можете сделать в отношении имен людей в базе данных, позвольте мнеУверяю вас, все мои имена либо "FIRST MIDDLE LAST", либо "FIRST LAST".Я проверил.

1 Ответ

3 голосов
/ 18 марта 2012

Если бы все имена имели одинаковую длину, вы могли бы использовать sortrows, но в вашем случае это потребовало бы дополнения и изменения вашего массива, так что вам лучше преобразовать его в "LAST FIRST MIDDLE" перед применением sort.К счастью, для этого есть простое регулярное выражение:

names = {'John Doe';'Roger Adrian';'John Fitzgerald Kennedy'};
names_rearranged = regexprep(names,'(.*) (\w*)$','$2 $1')
names_rearranged = 
    'Doe John'
    'Adrian Roger'
    'Kennedy John Fitzgerald'

[names_rearranged_sorted, idx_sorted] = sort(names_rearranged);

names_sorted = names(idx_sorted)
names_sorted = 
    'Roger Adrian'
    'John Doe'
    'John Fitzgerald Kennedy'
...