0

NSArrayをカスタムアルファベット順にソートしようとしています。私はオブジェクトの状態を含む文字列を持つArrayを持っているということです。NSSortDescriptorカスタム英数字の注文

利用可能な状態はentered, process, ready, doneです。

普通に(アルファベット順に)並べ替えると、注文は間違っています(完了、入力、処理、準備完了)。

私はそれを正しい方法で注文するには、次のコードを試してみました:

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES comparator:^(id obj1, id obj2) { 
    if ([obj1 isEqualToString:@"entered"] && [obj2 isEqualToString:@"process"]) { 
     return (NSComparisonResult) NSOrderedAscending; 
    } 
    else if ([obj1 isEqualToString:@"process"] && [obj2 isEqualToString:@"entered"]) { 
     return (NSComparisonResult) NSOrderedDescending; 
    } 
    else if ([obj1 isEqualToString:@"process"] && [obj2 isEqualToString:@"ready"]) { 
     return (NSComparisonResult) NSOrderedAscending; 
    } 
    else if ([obj1 isEqualToString:@"ready"] && [obj2 isEqualToString:@"process"]) { 
     return (NSComparisonResult) NSOrderedDescending; 
    } 
    else if ([obj1 isEqualToString:@"ready"] && [obj2 isEqualToString:@"done"]) { 
     return (NSComparisonResult) NSOrderedAscending; 
    } 
    else if ([obj1 isEqualToString:@"done"] && [obj2 isEqualToString:@"ready"]) { 
     return (NSComparisonResult) NSOrderedDescending; 
    } 
    else { 
     return (NSComparisonResult) NSOrderedSame; 
    } 
}]; 

を私はまた言葉のちょうど最初の文字を使用してみましたが、それはあまりにも動作しませんでした。

このコンパレータを使用しているときは、respを注文しないだけです。配列は「古い」順序を保持します。

私は間違って食事をしていますか?コンパイラのソートを正しく理解できませんでしたか?助けのための

おかげで、よろしく、ジュリアン

答えて

0

私はここにたくさんのコードがあるので、私は答えなければなりません。私は今、物事を実行している。しかし、今のバグ面白いバグ:)

NSString *str1 = (NSString *)obj1; 
NSString *str2 = (NSString *)obj2; 

if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"progress"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"ready"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"entered"] && [str2 isEqualToString:@"done"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"entered"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"ready"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"progress"] && [str2 isEqualToString:@"done"]) { 
    return (NSComparisonResult) NSOrderedAscending; 
} 
else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"entered"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"progress"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"ready"] && [str2 isEqualToString:@"done"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"entered"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"progress"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else if ([str1 isEqualToString:@"done"] && [str2 isEqualToString:@"ready"]) { 
    return (NSComparisonResult) NSOrderedDescending; 
} 
else { 
    return (NSComparisonResult) NSOrderedSame; 
} 

があります:私が注文方向(ascending:YES/NO)を変更していた場合、方向は右、私はascending:YES(入力され、進捗状況を注文してい毎秒時間であり、準備完了、完了)。そうでなければ、入力、進捗、完了、準備が少し間違っています。

誰もが想像することができますか、そのための解決策がありますか?それは深刻なバグではありませんが、私はそれを修正したいです。

ありがとう、ムンディ、しかし、私は私のファジースタイルを使用し続けると思います。私はCocoa/Objective Cの新機能です。この方法は今のところ私にとって意味があります。それにもかかわらず、あなたの努力のおかげで!

0

私は、文字列を使用してスキームはあなたがやろうとしているものに適していないと思います。状態を記録するには、別のデータモデルを使用し、ビュー内の適切な文字列を処理する方がはるかに優れています。今ソート

typedef enum { 
    entered = 0, 
    processed, 
    ready, 
    done 
} State; 

は些細次のようになります。

一般的な実装は、あなたがこのようにそれを定義した場合、自動的にインクリメントenumを伴います。

stateは実質的に整数のタイプStateである必要があります。 NSDictionaryまたはNSArrayを使用する場合はNSNumberにラップする必要がありますが、State@propertyでカスタムオブジェクトを作成すると確かに読みやすくなります。

+0

ちょっとムンディ!素晴らしいアプローチ、ありがとう!しかし今、どうすればNSString(状態名付き)を_state_型のオブジェクトに変換できますか?私のアプリケーションはウェブベースのアプリケーションのiOSラッパーであるため、データベースから表現を変更することはできません。 **ありがとうございました! –

+0

他のJSONやXMLの「フィールド」と同じ方法です。それらをカスタムオブジェクトのプロパティに1つずつマッチさせます。この場合はおそらくif文の文字列を使用します。 – Mundi

関連する問題