例えば以下のような二次元Arrayがあったとして、二次元配列内の先頭要素(アルファベット)を条件にして
ソートする方法をおしえてください。
お願いします。
■ソート前
{
{"C",1,5,1},
{"B",3,1,1},
{"A",5,8,2},
}
================================
■ソート後
{
{"A",5,8,2},
{"B",3,1,1},
{"C",1,5,1},
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
Objective
1NSArray* arr1 = @[@"C",@1,@5,@1]; 2NSArray* arr2 = @[@"B",@3,@1,@1]; 3NSArray* arr3 = @[@"A",@5,@8,@2]; 4NSArray* array1 = @[arr1,arr2,arr3]; 5 6NSArray* array2 = [array1 sortedArrayUsingComparator:^(id obj1, id obj2) { 7 NSArray* a = (NSArray*)obj1; 8 NSArray* b = (NSArray*)obj2; 9 return [[a firstObject] compare:[b firstObject]]; 10}]; 11 12NSLog(@"%@", array1); 13NSLog(@"%@", array2);
投稿2015/08/19 16:47
総合スコア2183
0
NSSortDescriptorによるソート
配列に格納されたクラスの複数要素に対するソート条件が必要なときに有効。
AppleのサンプルコードやSOFを見ているとCore DataやNSDictionaryなどのソートに力を発揮しそう。
今回は先ほどの配列とは別のデータを利用して説明する。
例として以下の定義に従うMyObjectクラスを作成して、
MyObject.h
@interface MyObject : NSObject
@property NSString *name;
@property int lifeTime;
- (id)initWithName:(NSString *)name withLifeTime:(int)lifeTime;
@end
このクラスから5つのインスタンスを生成して配列に格納する。
Objective-C
NSArray *nameArray = @[@"John", @"Mick", @"Tom", @"Sam", @"John"];
NSMutableArray *array = [NSMutableArray new];
for (int i = 0; i < 5; i++) {
[array addObject:[[MyObject alloc] initWithName:nameArray[i] withLifeTime:(arc4random() % 100)]];
}
配列内の各要素の出力結果はこのようになる。
Objective-C
John: 36
Mick: 44
Tom: 1
Sam: 61
John: 48
この配列のソート条件に
name(昇順)
lifeTime(昇順)
の2つのルールを追加する。
Objective-C
// ソート条件を定義
NSSortDescriptor *nameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.name" ascending:YES];
NSSortDescriptor *lifeTimeSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.lifeTime" ascending:YES];
// 上記
投稿2015/08/19 12:55
総合スコア69
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
public class MultiArraySortTest {
public static void main(String[] args) {
// String配列の配列を用意します。
String[][] testArray = new String[][] {
{"B", "1"},
{"A", "2"},
{"C", "3"},
{"A", "4"}
};
// 各String配列をソートします。
Arrays.sort(testArray, new StringArrayComparator());
// ソート結果を表示します。
for ( int i = 0; i < testArray.length; i++ ) {
for ( int j = 0; j < testArray[i].length; j++ ) {
System.out.print( "[" + testArray[i][j] + "]" );
}
System.out.println();
}
}
}
/**
- String配列を比較するクラス。<br>
/
class StringArrayComparator implements Comparator {
/*
- 渡されたオブジェクトを比較します。<br>
- このメソッドでは、2つの引数ともString配列であることを期待し、
- キャストした上、compare(array1, array2)を呼び出します。<br>
- よって、どちらかがString配列ではない場合、ClassCastExceptionをスローします。
- @param o1 比較するString配列オブジェクトその1。
- @param o2 比較するString配列オブジェクトその2。
- @return o1がo2より小さい場合は負の値を、
- o1がo2と等しい場合は0を、
- o1がo2より大きい場合は正の値を、戻します。
- @throws ClassCastExcep
投稿2015/08/19 12:43
総合スコア69
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/20 12:19