අභිරුචි වස්තු සමඟ NSMutableArray වර්ග කරන්නේ කෙසේද?


1272

මට කිරීමට අවශ්‍ය දේ ඉතා සරල බව පෙනේ, නමුත් මට වෙබයේ කිසිදු පිළිතුරක් සොයාගත නොහැක. මට NSMutableArrayවස්තු රාශියක් ඇති අතර, ඒවා 'පුද්ගල' වස්තූන් යැයි කියමු. NSMutableArrayPerson.birthDate අනුව වර්ග කිරීමට මට අවශ්‍යයNSDate .

මම හිතන්නේ එයට මෙම ක්‍රමයට යම් සම්බන්ධයක් ඇත:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

ජාවාහිදී මම මගේ වස්තුව සංසන්දනාත්මකව ක්‍රියාත්මක කිරීමට සලස්වන්නෙමි, නැතහොත් එකතු කිරීම්.සෝර්ට් අභිරුචි සංසන්දකයෙකු සමඟ භාවිතා කරන්න ... ඔබ මෙය පෘථිවියේ අරමුණ-සී තුළ කරන්නේ කෙසේද?

Answers:


2303

සංසන්දනය කිරීමේ ක්රමය

එක්කෝ ඔබ ඔබේ වස්තුව සඳහා සංසන්දනාත්මක ක්‍රමයක් ක්‍රියාත්මක කරයි:

- (NSComparisonResult)compare:(Person *)otherObject {
    return [self.birthDate compare:otherObject.birthDate];
}

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

NSSortDescriptor (වඩා හොඳ)

හෝ සාමාන්‍යයෙන් ඊටත් වඩා හොඳ:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                           ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

අරාව වෙත එකකට වඩා එකතු කිරීමෙන් ඔබට බහු යතුරු මගින් පහසුවෙන් වර්ග කළ හැකිය. අභිරුචි සංසන්දනාත්මක ක්‍රම භාවිතා කිරීම ද කළ හැකිය. ප්‍රලේඛනය දෙස බලන්න .

බ්ලොක් (දිලිසෙන!)

මැක් ඕඑස් එක්ස් 10.6 සහ iOS 4 සිට බ්ලොක් එකක් සමඟ වර්ග කිරීමේ හැකියාව ද ඇත:

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

කාර්ය සාධනය

මෙම -compare:සහ වාරණ මත පදනම් වූ ක්රමවේදයන් පොදුවේ භාවිතා වඩා ටිකක් විතර වේගවත් වනු ඇත NSSortDescriptorඅග KVC මත යැපෙන ලෙස. NSSortDescriptorක්‍රමයේ මූලික වාසිය නම්, එය කේතයට වඩා දත්ත භාවිතා කරමින් ඔබේ වර්ග කිරීමේ අනුපිළිවෙල නිර්වචනය කිරීමට ක්‍රමයක් සපයන අතර එමඟින් උදාසීන දේවල් සැකසීම පහසු කරයි එවිට පරිශීලකයන්ට NSTableViewශීර්ෂ පේළිය ක්ලික් කිරීමෙන් වර්ග කළ හැකිය .


67
පළමු උදාහරණයේ දෝෂයක් ඇත: ඔබ එක් වස්තුවක උපන්දිනය නිදර්ශන විචල්‍යය එහි උපත් දිනය විචල්‍යයට වඩා අනෙක් වස්තුව සමඟ සංසන්දනය කරයි.
මාටින් ජජල්ඩ්බෙක්

91
Ar මාටින්: ස්තූතියි! මට ඒ සඳහා උඩුකුරු 75 ක් ලැබීමට පෙර වෙන කිසිවෙකු නොදැන සිටීම විහිළුවක්.
ජෝර්ජ් ෂෝලි

77
මෙය පිළිගත් පිළිතුර වන අතර, එබැවින් බොහෝ පරිශීලකයින් විසින් එය නියත යැයි සලකනු ලබන බැවින්, 3 වන, බ්ලොක් මත පදනම් වූ උදාහරණයක් එක් කිරීම ප්‍රයෝජනවත් විය හැකි අතර එමඟින් එය පවතින බව පරිශීලකයින් දැන ගනු ඇත.
jpswain

6
@ තැඹිලි 80: මම එය උත්සාහ කළා. මට තවදුරටත් මැක් අයිති නැත, එබැවින් ඔබට කේතය දෙස බැලීමට හැකි නම් හොඳයි.
ජෝර්ජ් ෂෝලි

11
ඔබට NSMutableArrayi තිබේ නම් මම ක්‍රම භාවිතා කිරීමට කැමැත්තෙමි sortUsingDescriptors, sortUsingFunctionහෝ sortUsingSelector. අරාව විකෘති වන තාක් දුරට මට වර්ග කළ පිටපතක් අවශ්‍ය නොවේ.
ස්ටෙෆාන්

110

NSMutableArrayක්රමය බලන්නsortUsingFunction:context:

ඔබට වස්තු දෙකක් (වර්ගය , ඔබ වස්තු දෙකක් සංසන්දනය කරන බැවින් ) සහ සන්දර්භය පරාමිතියක් ගන්නා සංසන්දනාත්මක ශ්‍රිතයක් සැකසීමට අවශ්‍ය වේ .PersonPerson

මෙම වස්තූන් දෙක නිදසුන් පමණි Person. තෙවන වස්තුව නූලකි, උදා. Birth "උපන් දිනය".

මෙම ශ්‍රිතය මඟින් මෙය ලබා දෙයි NSComparisonResult: < NSOrderedAscendingනම් එය නැවත පැමිණේ . > නම් එය නැවත පැමිණේ . අවසාන වශයෙන්, == නම් එය නැවත පැමිණේPersonA.birthDatePersonB.birthDateNSOrderedDescendingPersonA.birthDatePersonB.birthDateNSOrderedSamePersonA.birthDatePersonB.birthDate .

මෙය රළු ව්‍යාජ කේතයකි; එක් දිනයක් "අඩු", "වැඩි" හෝ "සමාන" යන්න තවත් දිනයකට (තත්පර යුගයේ සිට තත්පර සංසන්දනය කිරීම වැනි) අදහස් කරන්නේ කුමක්දැයි ඔබට දැනගත යුතුය.

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  if ([firstPerson birthDate] < [secondPerson birthDate])
    return NSOrderedAscending;
  else if ([firstPerson birthDate] > [secondPerson birthDate])
    return NSOrderedDescending;
  else 
    return NSOrderedSame;
}

ඔබට වඩා සංයුක්ත යමක් අවශ්‍ය නම්, ඔබට ත්‍රිමාණ ක්‍රියාකරුවන් භාවිතා කළ හැකිය:

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  return ([firstPerson birthDate] < [secondPerson birthDate]) ? NSOrderedAscending : ([firstPerson birthDate] > [secondPerson birthDate]) ? NSOrderedDescending : NSOrderedSame;
}

ඔබ මෙය බොහෝ දේ කළහොත්, ඉන්ලයින් කිරීම මෙය ටිකක් වේගවත් කළ හැකිය.


9
SortUsingFunction භාවිතා කිරීම: සන්දර්භය: බොහෝ විට වඩාත්ම c-ish ක්‍රමය වන අතර නිශ්චිතවම කියවිය නොහැකි එකකි.
ජෝර්ජ් ෂෝලි

12
එහි කිසිඳු වැරැද්දක් නැත, නමුත් මම හිතන්නේ දැන් වඩා හොඳ විකල්ප තිබේ.
ජෝර්ජ් ෂෝලි

6
සමහර විට, නමුත් එය ජාවා පසුබිමක සිටින කෙනෙකුට කියවිය හැකි තරම් අඩු වනු ඇතැයි මම නොසිතමි, එය ජාවා හි වියුක්ත සංසන්දනාත්මක පන්තියට සමාන යමක් සොයනු ඇත, එය සංසන්දනය කරයි (obj1 ටයිප් කරන්න, obj2 ටයිප් කරන්න).
ඇලෙක්ස් රෙනෝල්ඩ්ස්

5
මෙම කදිම පිළිතුර ඉතා අඩු තාක්‍ෂණික කුසලතාවයක් තිබුණත්, ඔබගෙන් දෙදෙනෙකු මෙම පරිපූර්ණ පිළිතුර විවේචනය කිරීමට ඕනෑම හේතුවක් සොයන බව මට හැඟේ. අමුතුයි.
ඇලෙක්ස් රෙනෝල්ඩ්ස්

1
Ar යාර්: එක්කෝ ඔබට පළමු ඡේදයේ මා ලබා දුන් විසඳුම භාවිතා කළ හැකිය, නැතහොත් ඔබට විවිධ වර්ගයේ විස්තර භාවිතා කළ හැකිය. sortedArrayUsingDescriptors: වර්ග කිරීමේ විස්තර කරුවන් සමූහයක් තර්කයක් ලෙස ගනී.
ජෝර්ජ් ෂෝලි

63

මම මෙය iOS 4 හි බ්ලොක් එකක් භාවිතා කළෙමි. මගේ අරාවෙහි අංග හැඳුනුම්පතේ සිට මගේ පන්ති වර්ගයට දැමිය යුතුය. මෙම අවස්ථාවෙහිදී එය ලකුණු ලෙස හැඳින්වෙන පන්තියක් වන ලකුණු ලෙස හැඳින්වේ.

ඔබේ අරාවෙහි මූලද්‍රව්‍ය නිවැරදි වර්ගය නොවේ නම් කුමක් කළ යුතුද යන්න ඔබ විසින් තීරණය කළ යුතුය, මෙම උදාහරණය සඳහා මම දැන් ආපසු ආවෙමි NSOrderedSame, කෙසේ වෙතත් මගේ කේතයේ මම ව්‍යතිරේකයක් වුවද.

NSArray *sorted = [_scores sortedArrayUsingComparator:^(id obj1, id obj2){
    if ([obj1 isKindOfClass:[Score class]] && [obj2 isKindOfClass:[Score class]]) {
        Score *s1 = obj1;
        Score *s2 = obj2;

        if (s1.points > s2.points) {
            return (NSComparisonResult)NSOrderedAscending;
        } else if (s1.points < s2.points) {
            return (NSComparisonResult)NSOrderedDescending;
        }
    }

    // TODO: default is the same?
    return (NSComparisonResult)NSOrderedSame;
}];

return sorted;

PS: මෙය අවරෝහණ පිළිවෙලට වර්ග කිරීමකි.


6
ඔබට ඇත්ත වශයෙන්ම එහි "(ලකුණු *)" අවශ්‍ය නොවේ, ඔබට කළ හැක්කේ "ලකුණු * s1 = obj1;" මන්ද යත්, සම්පාදකයාගේ අනතුරු ඇඟවීමකින් තොරව හැඳුනුම්පත සතුටින් ඕනෑම දෙයකට දමනු ඇත :-)
jpswain

දකුණු තැඹිලි 80 downcastingදුර්වල විචල්‍යයට පෙර වාත්තු කිරීම අවශ්‍ය නොවේ.
thesummersign

ඔබ නොකඩවා ඉහළ හෝ පහළට නොකඩවා වර්ග කළ යුතුය, එබැවින් පෙරනිමි අවසන් ප්‍රතිලාභය විය හැකියreturn ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
ස්කොට් කෝර්ස්කැඩන්

හෙහ් ක්‍රිස්, මම මෙම කේතය උත්සාහ කළෙමි, මම මගේ වැඩසටහනේ hv නැවුම්බවක් කරමි .. පළමු වතාවට මම නිවැරදි රැකියාවක් කරමි, අවරෝහණ ප්‍රතිදානයක් ලැබුණි .. නමුත් මම නැවුම් කළ විට (එකම කේතය එකම දත්තයකින් ක්‍රියාත්මක කරන්න) ඇණවුම, එය බැස නොගිය බව කියන්න .. මගේ අරාවෙහි ඇති වස්තූන් 4 ක්, 3 hv එකම දත්ත, 1 වෙනස් බව පවසන්න.
නිකේෂ් කේ

"ලකුණු" පන්තියට අයත් නොවන වස්තූන් ඔබ සැබවින්ම අපේක්ෂා කරන්නේ නම්, ඔබ ඒවා ටිකක් පරිස්සමින් වර්ග කළ යුතුය. එසේ නොමැතිනම් ඔබට වෙනත් == ලකුණු 1 <ලකුණු 2 == නොගැලපෙන සහ කරදරයකට තුඩු දිය හැකි තත්වයක් තිබේ. අනෙක් සියලුම වස්තූන් ඉදිරියේ ලකුණු වස්තු වර්ග කිරීම සහ අනෙක් සියලුම වස්තු එකිනෙකට සමාන ලෙස වර්ග කිරීම යන අගය ඔබට ආපසු ලබා දිය හැකිය.
gnasher729

30

IOS 4 සිට ආරම්භ කිරීමෙන් ඔබට වර්ග කිරීම සඳහා කුට්ටි භාවිතා කළ හැකිය.

මෙම විශේෂිත උදාහරණය සඳහා මම උපකල්පනය කරන්නේ ඔබේ අරාවෙහි ඇති වස්තූන්ට 'පිහිටුම්' ක්‍රමයක් ඇති බවයි NSInteger.

NSArray *arrayToSort = where ever you get the array from... ;
NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) 
{
    if ([obj1 position] > [obj2 position]) 
    { 
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 position] < [obj2 position]) 
    {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
};
NSArray *sorted = [arrayToSort sortedArrayUsingComparator:sortBlock];

සටහන: "වර්ග කළ" අරාව ස්වයංක්‍රීයව මුදා හරිනු ඇත.


27

මම සියල්ල උත්සාහ කළෙමි, නමුත් මෙය මට ප්‍රයෝජනවත් විය. පංතියක මට " crimeScene" නමින් තවත් පංතියක් ඇති අතර, දේපල අනුව වර්ග කිරීමට අවශ්‍යයිcrimeScene .

මෙය චාම් එකක් මෙන් ක්‍රියා කරයි:

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"crimeScene.distance" ascending:YES];
[self.arrAnnotations sortUsingDescriptors:[NSArray arrayWithObject:sorter]];

22

ජෝර්ජ් ෂෝලිගේ දෙවන පිළිතුරෙහි අස්ථානගත වූ පියවරක් ඇත , නමුත් එය හොඳින් ක්‍රියාත්මක වේ.

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

// 's' එකතු කළේ මා පිටපත් කර අලවන විට කාලය නාස්ති වූ නිසා හා වර්ග කළ අරායූසිං ඩිස්ක්‍රිප්ටරයේ 's' නොමැතිව එය අසාර්ථක වූ බැවිනි.


ක්‍රම ඇමතුම ඇත්ත වශයෙන්ම "sortedArrayUsingDescriptors:", අවසානයේ 's' සමඟ.
CIFilter

20
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

ස්තූතියි, එය හොඳින් ක්‍රියාත්මක වේ ...


18

ඔබේ Personවස්තූන් සඳහා ක්‍රමවේදයක් ක්‍රියාත්මක කළ යුතුය, compare:වෙනත් Personවස්තුවක් ගන්නා දේ පවසන්න සහ ආපසු යන්නNSComparisonResult වස්තු 2 අතර සම්බන්ධතාවය අනුව යන්න.

එවිට ඔබ කැඳවනු sortedArrayUsingSelector:ඇත@selector(compare:) එය සිදු කළ යුතු වෙනවා.

වෙනත් ක්‍රම තිබේ, නමුත් මා දන්නා පරිදි Comparableඅතුරු මුහුණතේ කොකෝවා සමාන නොවේ . භාවිතා sortedArrayUsingSelector:කිරීම බොහෝ විට එය කිරීමට වඩාත්ම වේදනා රහිත ක්‍රමය වේ.


10

iOS 4 කුට්ටි ඔබව සුරකිනු ඇත :)

featuresArray = [[unsortedFeaturesArray sortedArrayUsingComparator: ^(id a, id b)  
{
    DMSeatFeature *first = ( DMSeatFeature* ) a;
    DMSeatFeature *second = ( DMSeatFeature* ) b;

    if ( first.quality == second.quality )
        return NSOrderedSame;
    else
    {
        if ( eSeatQualityGreen  == m_seatQuality || eSeatQualityYellowGreen == m_seatQuality || eSeatQualityDefault  == m_seatQuality )
        {
            if ( first.quality < second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        }
        else // eSeatQualityRed || eSeatQualityYellow
        {
            if ( first.quality > second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        } 
    }
}] retain];

http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html ටිකක් විස්තරයක්


9

සඳහා NSMutableArray, sortUsingSelectorක්රමය භාවිතා කරන්න . එය නව අවස්ථාවක් නිර්මාණය නොකර එය ස්ථානගත කරයි.


යාවත්කාලීනයක්: මමත් විකෘති අරා වර්ග කර ඇති යමක් සොයමින් සිටියෙමි, iOS 7 වන විට සියලුම "වර්ග කළ අරායුසිං" ක්‍රම සඳහා සමාන ක්‍රම "වර්ග කිරීම" දැන් sortUsingComparator:තිබේ.
jmathew

8

ඔබේ අරමුණු සඳහා පහත දැක්වෙන සාමාන්‍ය ක්‍රමය භාවිතා කළ හැකිය. එය ඔබගේ ගැටලුව විසඳිය යුතුය.

//Called method
-(NSMutableArray*)sortArrayList:(NSMutableArray*)arrDeviceList filterKeyName:(NSString*)sortKeyName ascending:(BOOL)isAscending{
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:sortKeyName ascending:isAscending];
    [arrDeviceList sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
    return arrDeviceList;
}

//Calling method
[self sortArrayList:arrSomeList filterKeyName:@"anything like date,name etc" ascending:YES];

7

ඔබ පෙළක් වර්ග කරන්නේ නම් NSNumbers, ඔබට ඒවා 1 ඇමතුමකින් වර්ග කළ හැකිය:

[arrayToSort sortUsingSelector: @selector(compare:)];

එය ක්‍රියාත්මක වන්නේ අරාවෙහි ඇති NSNumberවස්තූන් ( වස්තු) සංසන්දනය කිරීමේ ක්‍රමය ක්‍රියාත්මක කරන බැවිනි. ඔබට එකම දේ කළ හැකියNSString වස්තු හැකිය, හෝ සංසන්දනාත්මක ක්‍රමයක් ක්‍රියාත්මක කරන අභිරුචි දත්ත වස්තු සමූහයක් සඳහා පවා.

සංසන්දනාත්මක කොටස් භාවිතා කරමින් උදාහරණ කේත කිහිපයක් මෙන්න. සෑම ශබ්දකෝෂයකම "sort_key" යතුරක අංකයක් ඇතුළත් වන ශබ්ද කෝෂ රාශියක් එය වර්ග කරයි.

#define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
 ^(id obj1, id obj2) 
  {
  NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
  NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
  if (value1 > value2) 
{
  return (NSComparisonResult)NSOrderedDescending;
  }

  if (value1 < value2) 
{
  return (NSComparisonResult)NSOrderedAscending;
  }
    return (NSComparisonResult)NSOrderedSame;
 }];

ඉහත කේතය එක් එක් වර්ග කිරීමේ යතුර සඳහා පූර්ණ සංඛ්‍යාවක් ලබා ගැනීම හා ඒවා සංසන්දනය කිරීම, එය කරන්නේ කෙසේද යන්න පිළිබඳ නිදර්ශනයක් ලෙස ය. NSNumberවස්තූන් සංසන්දනාත්මක ක්‍රමයක් ක්‍රියාත්මක කරන බැවින් එය වඩාත් සරලව නැවත ලිවිය හැකිය:

 #define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
^(id obj1, id obj2) 
 {
  NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
  NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
  return [key1 compare: key2];
 }];

හෝ සංසන්දකයාගේ සිරුර පේළි 1 ක් දක්වා ආසවනය කළ හැකිය:

  return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];

කේතය කියවීමට පහසු සහ නිදොස් කිරීමට පහසු නිසා මම සරල ප්‍රකාශ සහ තාවකාලික විචල්‍යයන් වලට වැඩි කැමැත්තක් දක්වන්නෙමි. සම්පාදකයා තාවකාලික විචල්‍යයන් කෙසේ හෝ ඉවත් කරයි, එබැවින් සියලු පේළි අනුවාදයට කිසිදු වාසියක් නොමැත.


6
-(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted 
{
  NSArray *sortedArray;
  sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
  {
    return [a compare:b];
 }];
 return [sortedArray mutableCopy];
}

නව අරාවක් ආපසු ලබා දුන් විට, විකෘති අරාවකින් ගමන් කරන්නේ ඇයි. කිසිසේත් එතීම නිර්මාණය කරන්නේ ඇයි?
vikingosegundo

6

මම නම් කුඩා ප්රවර්ගය ක්රම පුස්තකාලයක්, නිර්මාණය කර ඇත ObjectiveC කිරීමට Linq දෙයක් මෙම වර්ග කිරීම වඩාත් පහසු කරයි බව. යතුරු තේරීම් කාරකයක් සමඟ වර්ග කිරීමේ ක්‍රමය භාවිතා කිරීමෙන් ඔබට birthDateපහත පරිදි වර්ග කළ හැකිය:

NSArray* sortedByBirthDate = [input sort:^id(id person) {
    return [person birthDate];
}]

ඔබ එය " LINQ to Objective-C " ලෙස හැඳින්විය යුතුය .
පීටර් මෝර්ටෙන්සන්

6

අභිරුචි අවශ්‍යතා මත පදනම්ව මම බහු මට්ටමේ වර්ග කිරීම සිදු කළෙමි.

// අගයන් වර්ග කරන්න

    [arrItem sortUsingComparator:^NSComparisonResult (id a, id b){

    ItemDetail * itemA = (ItemDetail*)a;
    ItemDetail* itemB =(ItemDetail*)b;

    //item price are same
    if (itemA.m_price.m_selling== itemB.m_price.m_selling) {

        NSComparisonResult result=  [itemA.m_itemName compare:itemB.m_itemName];

        //if item names are same, then monogramminginfo has to come before the non monograme item
        if (result==NSOrderedSame) {

            if (itemA.m_monogrammingInfo) {
                return NSOrderedAscending;
            }else{
                return NSOrderedDescending;
            }
        }
        return result;
    }

    //asscending order
    return itemA.m_price.m_selling > itemB.m_price.m_selling;
}];

https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec


6

මගේ සමහර ව්‍යාපෘති වල මම sortUsingFunction :: භාවිතා කර ඇත :

int SortPlays(id a, id b, void* context)
{
    Play* p1 = a;
    Play* p2 = b;
    if (p1.score<p2.score) 
        return NSOrderedDescending;
    else if (p1.score>p2.score) 
        return NSOrderedAscending;
    return NSOrderedSame;
}

...
[validPlays sortUsingFunction:SortPlays context:nil];

6

අභිරුචි වස්තු සමඟ NSMutableArray වර්ග කිරීම සඳහා ඔබ NSSortDescriptor භාවිතා කරයි

 NSSortDescriptor *sortingDescriptor;
 sortingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                       ascending:YES];
 NSArray *sortArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

3

වර්ග NSMutableArrayකිරීම ඉතා සරල ය:

NSMutableArray *arrayToFilter =
     [[NSMutableArray arrayWithObjects:@"Photoshop",
                                       @"Flex",
                                       @"AIR",
                                       @"Flash",
                                       @"Acrobat", nil] autorelease];

NSMutableArray *productsToRemove = [[NSMutableArray array] autorelease];

for (NSString *products in arrayToFilter) {
    if (fliterText &&
        [products rangeOfString:fliterText
                        options:NSLiteralSearch|NSCaseInsensitiveSearch].length == 0)

        [productsToRemove addObject:products];
}
[arrayToFilter removeObjectsInArray:productsToRemove];

3

NSComparator භාවිතා කර වර්ග කරන්න

NSComparatorඅභිරුචි වස්තු සංසන්දනය කිරීම සඳහා භාවිතා කළ යුතු අභිරුචි වස්තු වර්ග කිරීමට අපට අවශ්‍ය නම් . වාරණය නැවත ලබා දෙයිNSComparisonResultවස්තු දෙකේ අනුපිළිවෙල දැක්වීමට අගය ලබා දෙයි. එබැවින් සම්පූර්ණ අරාව වර්ග කිරීම සඳහා NSComparatorපහත දැක්වෙන ආකාරයෙන් භාවිතා වේ.

NSArray *sortedArray = [employeesArray sortedArrayUsingComparator:^NSComparisonResult(Employee *e1, Employee *e2){
    return [e1.firstname compare:e2.firstname];    
}];

NSSortDescriptor භාවිතා කරන වර්ග
උදාහරණයක් ලෙස, අපට අභිරුචි පංතියක අවස්ථා අඩංගු පෙළක් ඇති බව උපකල්පනය කරමු, පළමු නම, අවසාන නම සහ වයස යන ගුණාංග ඇත. පහත දැක්වෙන උදාහරණයෙන් දැක්වෙන්නේ වයස් යතුර අනුව අරාව අන්තර්ගතය ආරෝහණ අනුපිළිවෙලට වර්ග කිරීම සඳහා භාවිතා කළ හැකි NSSortDescriptor එකක් නිර්මාණය කරන්නේ කෙසේද යන්නයි.

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

අභිරුචි සැසඳීම් භාවිතා කර වර්ග කරන්න
නම් නූල් වන අතර, ඔබ පරිශීලකයාට ඉදිරිපත් කිරීම සඳහා නූල් වර්ග කරන විට ඔබ සැමවිටම දේශීයකරණය කළ සැසඳීමක් භාවිතා කළ යුතුය. බොහෝ විට ඔබට අවශ්‍ය වන්නේ සිද්ධි සංවේදී නොවන සංසන්දනයක් කිරීමට ය. අන්තිම සහ මුල් නම අනුව අරාව ඇණවුම් කිරීමට (localizedStandardCompare :) සමඟ උදාහරණයක් මෙහි පැමිණේ.

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

යොමු කිරීම සහ සවිස්තරාත්මක සාකච්ඡාව සඳහා කරුණාකර යොමු වන්න: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / object-c / how-to-sort-nsarray-with-custom-object /


2

ස්විෆ්ට් හි ප්‍රොටෝකෝල සහ ක්‍රියාකාරී ක්‍රමලේඛනය මඟින් ඔබේ පන්තිය සැසඳිය හැකි ප්‍රොටෝකෝලය සමඟ අනුකූල වීම, ප්‍රොටෝකෝලය අවශ්‍ය ක්‍රම ක්‍රියාත්මක කිරීම සහ වර්ග කිරීම (අනුව :) ඉහළ පෙළේ ශ්‍රිතය භාවිතා කිරීම අවශ්‍ය නොවන පරිදි වර්ග කළ අරාවක් නිර්මාණය කිරීම ඉතා පහසු කරයි. විකෘති අරා මාර්ගය.

class Person: Comparable {
    var birthDate: NSDate?
    let name: String

    init(name: String) {
        self.name = name
    }

    static func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate === rhs.birthDate || lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedSame
    }

    static func <(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedAscending
    }

    static func >(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedDescending
    }

}

let p1 = Person(name: "Sasha")
p1.birthDate = NSDate() 

let p2 = Person(name: "James")
p2.birthDate = NSDate()//he is older by miliseconds

if p1 == p2 {
    print("they are the same") //they are not
}

let persons = [p1, p2]

//sort the array based on who is older
let sortedPersons = persons.sorted(by: {$0 > $1})

//print sasha which is p1
print(persons.first?.name)
//print James which is the "older"
print(sortedPersons.first?.name)

1

මගේ නඩුවේදී, මම අරාව වර්ග කිරීම සඳහා "sortedArrayUsingComparator" භාවිතා කරමි. පහත කේතය දෙස බලන්න.

contactArray = [[NSArray arrayWithArray:[contactSet allObjects]] sortedArrayUsingComparator:^NSComparisonResult(ContactListData *obj1, ContactListData *obj2) {
    NSString *obj1Str = [NSString stringWithFormat:@"%@ %@",obj1.contactName,obj1.contactSurname];
    NSString *obj2Str = [NSString stringWithFormat:@"%@ %@",obj2.contactName,obj2.contactSurname];
    return [obj1Str compare:obj2Str];
}];

මගේ පරමාර්ථය වන්නේ,

@interface ContactListData : JsonData
@property(nonatomic,strong) NSString * contactName;
@property(nonatomic,strong) NSString * contactSurname;
@property(nonatomic,strong) NSString * contactPhoneNumber;
@property(nonatomic) BOOL isSelected;
@end

1

ඔබට sortDescriptor සෑදිය යුතු අතර පහත දැක්වෙන ආකාරයට sortDescriptor භාවිතා කිරීමෙන් ඔබට nsmutablearray වර්ග කළ හැකිය.

 let sortDescriptor = NSSortDescriptor(key: "birthDate", ascending: true, selector: #selector(NSString.compare(_:)))
 let array = NSMutableArray(array: self.aryExist.sortedArray(using: [sortDescriptor]))
 print(array)

1

කැදැලි වස්තු සඳහා මේ ආකාරයට භාවිතා කරන්න,

NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastRoute.to.lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSMutableArray *sortedPackages = [[NSMutableArray alloc]initWithArray:[packages sortedArrayUsingDescriptors:@[sortDescriptor]]];

lastRoute යනු එක් වස්තුවක් වන අතර එම වස්තුව වස්තුවට වස්තුවක් දරයි.


0

අරා ස්විෆ්ට් හි වර්ග කරන්න


සඳහා Swiftyපහත පුද්ගලයා ගෝලීය සඳහා ඉහත අරමුණු සාක්ෂාත් කර ගැනීම සඳහා ඉතා පිරිසිදු කිරීම. Userසමහර ගුණාංග ඇති අභිරුචි පන්තියක් සඳහා උදාහරණ කරමු .

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
}

දැන් අපට අරාව ඇත, එය createdDateනැගීම සහ / හෝ බැසීමේ පදනම මත වර්ග කළ යුතුය . එබැවින් දිනය සංසන්දනය සඳහා ශ්‍රිතයක් එක් කිරීමට ඉඩ දෙමු.

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
    func checkForOrder(_ otherUser: User, _ order: ComparisonResult) -> Bool {
        if let myCreatedDate = self.createdDate, let othersCreatedDate = otherUser.createdDate {
            //This line will compare both date with the order that has been passed.
            return myCreatedDate.compare(othersCreatedDate) == order
        }
        return false
    }
}

දැන් ඇති ඉඩ extensionපිළිබඳ Arrayසඳහා User. සරල වචන වලින් කිවහොත්, අරේ හි Userවස්තූන් පමණක් ඇති සමහර ක්‍රම එකතු කිරීමට ඉඩ දෙන්න .

extension Array where Element: User {
    //This method only takes an order type. i.e ComparisonResult.orderedAscending
    func sortUserByDate(_ order: ComparisonResult) -> [User] {
        let sortedArray = self.sorted { (user1, user2) -> Bool in
            return user1.checkForOrder(user2, order)
        }
        return sortedArray
    }
}

නැගීමේ ඇණවුම සඳහා භාවිතය

let sortedArray = someArray.sortUserByDate(.orderedAscending)

අවරෝහණ ඇණවුම සඳහා භාවිතය

let sortedArray = someArray.sortUserByDate(.orderedAscending)

එකම ඇණවුම සඳහා භාවිතය

let sortedArray = someArray.sortUserByDate(.orderedSame)

ඉහත ක්‍රමයට extensionප්‍රවේශ විය හැක්කේ Arrayවර්ගය නම් පමණි [User]||Array<User>


0

ස්විෆ්ට් අනුවාදය: 5.1

ඔබට අභිරුචි ව්‍යුහයක් හෝ පංතියක් තිබේ නම් සහ ඒවා අත්තනෝමතික ලෙස වර්ග කිරීමට අවශ්‍ය නම්, ඔබ සඳහන් කළ ක්ෂේත්‍රයක් මත වර්ග කර ඇති පසුපස වසා දැමීමක් භාවිතා කරමින් වර්ග කිරීම () අමතන්න. විශේෂිත දේපලක් මත වර්ග කරන අභිරුචි ව්‍යුහයන් භාවිතා කරන උදාහරණයක් මෙන්න:

    struct User {
        var firstName: String
    }

    var users = [
        User(firstName: "Jemima"),
        User(firstName: "Peter"),
        User(firstName: "David"),
        User(firstName: "Kelly"),
        User(firstName: "Isabella")
    ]

    users.sort {
        $0.firstName < $1.firstName
    }

ඔබට එය වර්ග කිරීම වෙනුවට වර්ග කළ අරාවක් ආපසු ලබා දීමට අවශ්‍ය නම්, මේ ආකාරයට වර්ග කළ () භාවිතා කරන්න:

    let sortedUsers = users.sorted {
        $0.firstName < $1.firstName
    }


-2
NSMutableArray *stockHoldingCompanies = [NSMutableArray arrayWithObjects:fortune1stock,fortune2stock,fortune3stock,fortune4stock,fortune5stock,fortune6stock , nil];

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"companyName" ascending:NO];

[stockHoldingCompanies sortUsingDescriptors:[NSArray arrayWithObject:sortOrder]];

NSEnumerator *enumerator = [stockHoldingCompanies objectEnumerator];

ForeignStockHolding *stockHoldingCompany;

NSLog(@"Fortune 6 companies sorted by Company Name");

    while (stockHoldingCompany = [enumerator nextObject]) {
        NSLog(@"===============================");
        NSLog(@"CompanyName:%@",stockHoldingCompany.companyName);
        NSLog(@"Purchase Share Price:%.2f",stockHoldingCompany.purchaseSharePrice);
        NSLog(@"Current Share Price: %.2f",stockHoldingCompany.currentSharePrice);
        NSLog(@"Number of Shares: %i",stockHoldingCompany.numberOfShares);
        NSLog(@"Cost in Dollars: %.2f",[stockHoldingCompany costInDollars]);
        NSLog(@"Value in Dollars : %.2f",[stockHoldingCompany valueInDollars]);
    }
    NSLog(@"===============================");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.