質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

3回答

4317閲覧

【objective-c】二次元Arrayの中の要素を条件としたソート方法

oym

総合スコア24

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2015/08/19 10:46

例えば以下のような二次元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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oym

2015/08/20 12:19

ご回答ありがとうございます。 他の方の回答を参考に自分でバブルソートアルゴリズムベースでゴリゴリ書いて実現しましたが、Stripe様のご回答が一番スマートな実現方法でしたのでベストアンサーとさせていただきました。 ありがとうございました。
guest

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

piotcard

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oym

2015/08/19 15:07

参考にさせていただきます。 ご回答ありがとうございました。
guest

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

piotcard

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oym

2015/08/19 15:07

参考にさせていただきます。 ご回答ありがとうございました。
Stripe

2015/08/19 16:34

ん?そのコードはJavaですか?
piotcard

2015/08/20 03:58

すみませんjavaで記載しました下記にobjective-cで記載しました参考になれば幸いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問