Сортировка строк в MATLAB, как в Windows 7, сортирует имена файлов в проводнике (с учетом чисел в середине строки) - PullRequest
6 голосов
/ 28 марта 2012

Каков наилучший способ сортировки строк в MATLAB с учетом чисел, которые могут присутствовать в середине строки?

Следующий пример иллюстрирует мою проблему.401 является численно более высоким значением, чем 6. Следовательно, строка Ie401sp2 должна быть указана после строки Ie6 при сортировке в порядке возрастания.В этом примере обратите внимание, как сортируются следующие строки, содержащие цифры.

--- Matlab --- (Не сортировать так, как я хочу)
Ie4_01
Ie4_128
Ie401sp2
Ie5
Ie501sp2
Ie6

--- Windows 7 --- (как я хочу, чтобы MATLAB сортировал)
Ie4_01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2

Windows 7 учитывает относительные значения чисел, которые появляются в середине строки.Каков наилучший способ сделать это в Matlab?Я стараюсь избегать незначительного касания, чтобы заново изобрести колесо.

1 Ответ

2 голосов
/ 28 марта 2012

Это немного хакерская версия, но она примерно работает:

function x = sortit(x)

% get a sortable version of each element of x
hacked_x = cellfun( @iSortVersion, x, 'UniformOutput', false );
% sort those, discard the sorted output
[~, idx] = sort( hacked_x );
% re-order input by sorted order.
x = x(idx);
end

% convert a string with embedded numbers into a sortable string
function hack = iSortVersion( in )
pieces = regexp( in, '(\d+|[^\d]+)', 'match' );
pieces = cellfun( @iZeroPadNumbers, pieces, 'UniformOutput', false );
hack = [ pieces{:} ];
end

% if a string containing a number, pad with lots of zeros
function nhack = iZeroPadNumbers( in )
val = str2double(in);
if isnan(val)
    nhack = in;
else
    nhack = sprintf( '%030d', val );
end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...