Mansoor
Mansoor

Reputation: 2438

Sort the fields in a struct based on value

Say I have a struct:

MyStruct.a = 12;
MyStruct.b = 22;
MyStruct.c = 32;

Can I modify it so that the fields are ordered based on their value:

MyStruct
c: 32
b: 22
a: 12

The orderfields methods allow ordering of the struct based on the field name or other structures/cell arrays, but not by value.

Upvotes: 1

Views: 703

Answers (2)

RM25483
RM25483

Reputation: 36

% Define initial structure:

myStruct.a = 12;
myStruct.b = 22;
myStruct.c = 32;

% Find desired order of values, rather than fieldnames:

[ ~,sortIdx ] = sort( structfun( @(x) x, myStruct ), 'descend' );

% Apply orderfields():

mySortedStruct = orderfields( myStruct, sortIdx )

Upvotes: 2

Cris Luengo
Cris Luengo

Reputation: 60484

orderfields has a syntax where it orders based on a permutation array. The second output of sort is a permutation array. Something like this should work:

[~,I] = sort(cell2mat(struct2cell(MyStruct)));
I = flip(I); % reverse ordering to get larger elements first
MyStruct = orderfields(MyStruct,I);

Upvotes: 1

Related Questions