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

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

ただいまの
回答率

90.60%

  • Xcode

    4001questions

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

  • Objective-C

    1172questions

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

  • iPhone

    963questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,857

oym

score 16

例えば以下のような二次元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},
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

NSArray* arr1 = @[@"C",@1,@5,@1];
NSArray* arr2 = @[@"B",@3,@1,@1];
NSArray* arr3 = @[@"A",@5,@8,@2];
NSArray* array1 = @[arr1,arr2,arr3];
        
NSArray* array2 = [array1 sortedArrayUsingComparator:^(id obj1, id obj2) {
  NSArray* a = (NSArray*)obj1;
  NSArray* b = (NSArray*)obj2;
  return [[a firstObject] compare:[b firstObject]];
}];
        
NSLog(@"%@", array1);
NSLog(@"%@", array2);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/20 21:19

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

    キャンセル

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/20 00:07

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

    キャンセル

  • 2015/08/20 01:34

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

    キャンセル

  • 2015/08/20 12:58

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

    キャンセル

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/20 00:07

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

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Xcode

    4001questions

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

  • Objective-C

    1172questions

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

  • iPhone

    963questions

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