删除单词列表中的重复元素并计算重复次数

时间:2014-02-26 19:41:39

标签: matlab sorting

这是我的代码,我试图对一个单词数组进行排序,并调用排序数组'a'。 我正在尝试使用while循环来比较a的相邻元素,并且在排序时,任何重复应该已经彼此相邻。如果有重复,我会删除单词并将其删除到计数中。我不确定如何让我的输出显示每个排序的单词及其相关的计数。感谢您的任何帮助。 (myAsort是我已经做过的一个函数,它将单词按字母顺序排列) 例如,如果我输入myACsort({'cat','dog','cat'),我希望输出为:

answer = 
    'cat'     'dog'
    count:2   count:1

function [ answer ]= myACsort( input )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here
a = myAsort(input);
n = length(a);
i = 1;
count = 1;
while (i<=n)
    if isequal(a{i},a{i+1})
        a(i+1) = [];
        count = count+1;
    else
        count = 1;
        i=i+1;


    end

end



end

2 个答案:

答案 0 :(得分:2)

uniqueaccumarray的通常组合是我的建议:

>> strs = {'cat','dog','cat'};
>> [uStr,ia,ic] = unique(strs);
>> countCell = [uStr(:).'; num2cell(accumarray(ic,1)).']
countCell = 
    'cat'    'dog'
    [  2]    [  1]

仅供参考,您可以稍后通过counts = [countCell{2,:}];提取计数。


如果你想在没有这些功能帮助的情况下这样做,你可以修改你的myACsort功能,如下所示:

function answer = myACsort(input)
a = sort(input); % sort operates on cell arrays of strings
i = 1; count = 1;
uwords = a(1);
while (i<numel(a))
    if i<numel(a) && isequal(a{i},a{i+1})
        a(i+1) = [];
        count(i) = count(i)+1;
    else
        i=i+1;
        count(i) = 1;
        uwords(i) = a(i); 
    end
end
answer = [uwords(:).'; num2cell(count(:)).'];

尽管阵列增长效率不高。

答案 1 :(得分:0)

另一种方法:对字符串(变量sortedStrs)进行排序,检测排序序列(变量ind)中每次运行相等字符串的结束,并从中轻松获得结果。 / p>

strs = {'cat','dog','cat'}; %// data
n = numel(strs);
sortedStrs = sort(strs);
dif = arrayfun(@(n) ~strcmp(sortedStrs{n},sortedStrs{n-1}), 2:n);
ind = [ find(dif) n ];
result(1,:) = sortedStrs(ind);
result(2,:) = mat2cell([ind(1) diff(ind)],1,ones(1,numel(ind)));