Я хочу отображать данные в двух столбцах. В первом столбце будет название фильма, а во втором - рейтинг из 5. Я хочу, чтобы данные отображались таким образом, чтобы все рейтинги, независимо от длины названия фильма, отображались на вертикальной линии. В настоящее время у меня есть:

Toy Story (1995) :   4
GoldenEye (1995) :   3
Seven (Se7en) (1995) :   4
Braveheart (1995) :      1
Bad Boys (1995) :    3
Batman Forever (1995) :      2
Star Wars (1977) :   5
Shawshank Redemption, The (1994) :   5
Ace Ventura: Pet Detective (1994) :      3
Aladdin (1992) :     3

Я использую следующий код:

fprintf('%s : \t %d\n', movieList{i},user_ratings(i));

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

1
user481610 21 Май 2014 в 23:17

2 ответа

Лучший ответ

Если вы хотите, чтобы все было просто и ваш цикл, вы можете попробовать это -

lens = cellfun(@numel,movieList);
pdlens = max(lens) - lens;
for k = 1:numel(movieList)
    fprintf('%s%s :\t%d\n', movieList{k},repmat(' ',1,pdlens(k)),user_ratings(k))
end

Выход -

Toy Story (1995)                  : 4
GoldenEye (1995)                  : 3
Seven (Se7en) (1995)              : 4
Braveheart (1995)                 : 1
Bad Boys (1995)                   : 3
Batman Forever (1995)             : 2
Star Wars (1977)                  : 5
Shawshank Redemption, The (1994)  : 5
Ace Ventura: Pet Detective (1994) : 3
Aladdin (1992)                    : 3

Альтернативное решение на основе arrayfun -

spc = repmat(' ',numel(movieList),1)
pdc = arrayfun(@(x,t) repmat(x,1,t),spc,pdlens,'uni',0) %//pdlens is from earlier code
spcell = repmat(cellstr({'   '}),numel(movieList),1)
out = strcat(movieList,pdc,':',spcell,num2str(user_ratings')) %//'
char(out) %// Display the text
3
Divakar 21 Май 2014 в 20:18

Вы можете попробовать это, это действительно не красиво, но:

maxVal = 0
[~,nbMovie] = size(movieList);
for i = 1:nbMovie
    maxVal = max(maxVal,length(movieList{i}))
end

wordPrint = strcat('%',int2str(maxVal),'s');
totalPrint = strcat(wordPrint,' : %f\n');

for i = 1:nbMovie
   fprintf(totalPrint ,movieList{i},user_ratings(i));
end

ИЗМЕНИТЬ

А для выравнивания слова по левому краю используйте символ '-' перед числом, например:

wordPrint = strcat('%-',int2str(maxVal),'s');
0
Vuwox 21 Май 2014 в 19:49