2013-08-02 48 views
0

所以我有一個自定義的「元素」對象(嘿保持原子序數,化學符號,原子量等...)的數組,我無法通過它們的一個屬性對它們進行排序;排序自定義對象數組的問題

下面是代碼:

switch (sortDescriptor) { 

     case 0: { 
      //Sort the array by "ATOMIC NUMBER" 
      NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) { 
       NSNumber *first = @([(SAMElement *)a atomicNumber]); 
       NSNumber *second = @([(SAMElement *)b atomicNumber]); 
       return [first compare:second]; 
      }]; 
      self.elementsArray = [sortedArray mutableCopy]; 
     } 

     case 1: { 
      //Sort the array by "ELEMENT NAME" 
      NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) { 
       NSString *first = [(SAMElement *)a elementName]; 
       NSString *second = [(SAMElement *)b elementName]; 
       return [first compare:second]; 
      }]; 
      self.elementsArray = [sortedArray mutableCopy]; 
     } 
     case 2:{ 
      NSLog(@"sorting by chemical symbol"); 
      //Sort the array by "CHEMICAL SYMBOL" 
      NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) { 
       NSString *first = [(SAMElement *)a chemichalSymbol]; 
       NSString *second = [(SAMElement *)b chemichalSymbol]; 
       return [first compare:second]; 
      }]; 
      self.elementsArray = [sortedArray mutableCopy]; 
     } 

     case 3: { 
      //Sort the array by "ATOMIC MASS" 
      NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) { 
       NSNumber *first = [(SAMElement *)a atomicMass]; 
       NSNumber *second = [(SAMElement *)b atomicMass]; 
       return [first compare:second]; 
      }]; 
      self.elementsArray = [sortedArray mutableCopy]; 
     } 
     default: 
      break; 
    } 

當是各種各樣返回元素的完全隨機的名單。難道我做錯了什麼?

+0

您是否調試過代碼以使「第一個」和「第二個」屬性的值保持一致? –

+1

你是否故意在案例塊之後忽略'break;',以便例如當sortDescriptor == 2時,數組首先按化學符號排序,然後再按原子質量排序? – jaetzold

+0

有沒有任何答案適合你?如果是,請接受其中一個,以便從未答覆中刪除您的問題。如果沒有,請給出一些反饋與新的信息。 –

回答

3

通過對象的某些屬性(使用NSSortDescriptor)對對象數組進行排序的最佳方法。在initWithKey中,可以設置要排序的屬性的名稱。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"atomicNumber" ascending:NO]; 
[self.elementsArray sortUsingDescriptors:@[sortDescriptor]]; 

在你的情況,只需在您的switch語句的每一種情況下部分複製此碼以上,改@"elementName"@"chemichalSymbol"的關鍵。

您可以將ascending的值從NO更改爲YES,具體取決於您想要的訂單類型。

請讓我知道如果工作與否。

+0

沒有錯,但以這種方式使用'initWithObjects:count:'是不尋常的。任何你選擇這樣做的原因,而不是簡單的'arrayWithObject:'(或者現在用文字當然是:'@ []')。 –

+0

該語法是因爲它使用對sortDescriptor指針的引用,並且一旦它不是'id'對象,就無法使用這些初始化器。但是我現在做了一些研究,並且看到sortDescriptor中沒有參考操作數的其他代碼。我認爲我的代碼有點過時了,我很久以前就查找了它,所以我編輯了我的代碼以使用新的語法更新。 –

1

我沒有立即看到錯誤,但是您在這裏重新發明了方向盤。這樣做的正確的工具是sortedArrayUsingDescriptors:

[self.elementsArray sortedArrayUsingDescriptors:@[ 
       [NSSortDescriptor alloc] initWithKey:@"atomicNumber"] ascending:YES] 
                ]]; 

試一下,看看它是否擺脫你的bug。如果您獲得隨機訂單,那通常表明您的比較器不一致(有時A> B,有時B> A,對於相同的A & B)。