- PR -

構造体配列のソートの仕方

投稿者投稿内容
新人
会議室デビュー日: 2004/03/09
投稿数: 1
投稿日時: 2004-03-09 16:12
初めましてきゅきゅ〜と言います。

最近 VB.NET2003を使ってます。

構造体配列を使用して複数キー指定でソートをしたいのですが
データベースでいう Order bみたいな事です。
ヘルプ等や他の掲示板見ても載ってなくて困っています。
(載っていてもよく解りません)
誰かご存知の方、教えて頂けないでしょうか。

宜しくお願いします
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-09 17:43
引用:

きゅきゅ〜さんの書き込み (2004-03-09 16:12) より:

最近 VB.NET2003を使ってます。

構造体配列を使用して複数キー指定でソートをしたいのですが
データベースでいう Order bみたいな事です。
ヘルプ等や他の掲示板見ても載ってなくて困っています。
(載っていてもよく解りません)


 これだけの情報では、おそらく他の掲示板のように、よくわからない回答しかできません。

 例えばこの質問内容だと、「福岡に行きたいのですが、いろいろ調べてみたのですがわかりません。行き方を教えてください」と同じレベルです。どこから出発するのか、予算はどれくらいなのか、いつまでに着かなければならないのか、そういう具体的なことがわからなければ、回答のしようがない/または無意味な回答になりますよね?


  • どれくらいプログラミングに精通しているのか(業務、趣味など、1日にどれくらい触っているかと、経験年/月数など、力量を推し量れる程度)
  • その中で、VB.NETはどれくらい使っているのか
  • 参考にした「他の掲示板」のURL
  • 参考にしたヘルプのトピック
  • 参考にしたものの中で、どこが理解できなかったか
  • どんなことをしてみたのか
  • してみたことで、どうなることを期待して、どういう結果が得られたか

最低でもこれくらいの情報をください。
弟子
会議室デビュー日: 2004/02/03
投稿数: 11
投稿日時: 2004-03-09 17:52
たとえば、ソートする項目が3つある場合、これを優先度順にA,B,Cとして

1) Aをソート
2) Aの同順の要素の範囲を見つけBでソート
3) Bの同順の要素の範囲をみつけCでソート

が、一番単純でわかりやすいかと。

他に効率のいい方法があるかはわかりませんが・・・。

--------------
あれ?全然違う事を言われてます?

[ メッセージ編集済み 編集者: 弟子 編集日時 2004-03-09 19:01 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-03-09 17:54
IComparerインターフェースを実装したオブジェクトを作ってみてはどうでしょう。
で、ArrayのstaticメンバのSort()でソートする。

やったことはありませんけど、できると思います。


-------------
と書いて、話が続くのかもう少し噛み砕かなければいけないのか分からない、ってことですね、Jittaさんのおっしゃっていることは。

[ メッセージ編集済み 編集者: 一郎 編集日時 2004-03-09 18:22 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-09 20:39
引用:

一郎さんの書き込み (2004-03-09 17:54) より:

と書いて、話が続くのかもう少し噛み砕かなければいけないのか分からない、ってことですね、Jittaさんのおっしゃっていることは。


そうです。ヘルプをみたということは、IComparableインタフェースのヘルプもみているなら、単純な比較の例は載っていてたでしょう。それが理解できなかったのか、それとも対象が3つあるケースに応用できなかったのか、はたまたそのヘルプに行き当たらなかったのか。。。
 行き当たっていなかったのなら、そのヘルプだけ示せばわかるのか、それとも処理手順まで書かなければいけないのか、あるいはプログラム例を作らなければいけないのか、そのプログラム例もこちらが動作確認までしなければいけないのか。。。


 ふざけているようですが、まじめに、「何がわからないのか、わかりません」
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-10 08:35
引用:

弟子さんの書き込み (2004-03-09 17:52) より:
たとえば、ソートする項目が3つある場合、これを優先度順にA,B,Cとして

1) Aをソート
2) Aの同順の要素の範囲を見つけBでソート
3) Bの同順の要素の範囲をみつけCでソート

が、一番単純でわかりやすいかと。

他に効率のいい方法があるかはわかりませんが・・・。


 例えば、一郎さんのおっしゃっているIComparableインタフェースは、他のオブジェクトと比較するためのCompareToメソッドを定義します。これは、引数で渡されたオブジェクトと、自分自身を比較し、自分の方が小さければ負の値、同じならば0、自分の方が大きければ正の値を返します。
 このため、Aでソート後に「同じ並びの範囲」を探すのではなく、CompareToメソッドで、

  1. Aで比較する
  2. Aが同じならばBで比較する
  3. Bも同じならばCで比較する
  4. Cも同じならば0を返す

ように作ると、効率的、というか、そう作ります。

 で、元の質問の方ですが、「構造体」というのが気になるのですが、structでなければならないなら、構造体と、それと同じ構造のクラスと、そのクラスのコレクションの3つを定義し、コレクションクラスに「構造体の配列を返す」メソッドを定義すればよいかと。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-03-10 09:40
引用:

Jittaさんの書き込み (2004-03-10 08:35) より:
 例えば、一郎さんのおっしゃっているIComparableインタフェースは、


えーと、私が書いてるのはIComparerです。
複数キー指定でソートというのが、その時その時でソートするために見る項目を変えるという意味なら、IComparableで比較の仕方を固定で持たせるわけにはいきませんよね。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-03-10 10:01
引用:

Jittaさんの書き込み (2004-03-10 08:35) より:
 で、元の質問の方ですが、「構造体」というのが気になるのですが、structでなければならないなら、構造体と、それと同じ構造のクラスと、そのクラスのコレクションの3つを定義し、コレクションクラスに「構造体の配列を返す」メソッドを定義すればよいかと。


ちょっと質問なんですが、クラスを〜と仰っているのはなぜなんでしょう?
構造体配列のソートは(場合によっては)効率が悪いかもとか、インスタンスの関係に注意が要るかもとか、以外に何かありましたっけ?

スキルアップ/キャリアアップ(JOB@IT)