C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 二段階でのソートをするには


(過去ログ 164 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■94923 / inTopicNo.1)  二段階でのソートをするには
  
□投稿者/ はる (25回)-(2020/06/04(Thu) 12:33:59)

分類:[VB.NET/VB2005 以降] 

先ずある条件にてのソートをし、その結果に基づきそれを優先しての、
次の条件にてのソートをするにはどうのようにすれば良いのでしょうか?

引用返信 編集キー/
■94925 / inTopicNo.2)  Re[1]: 二段階でのソートをするには
□投稿者/ 魔界の仮面弁士 (2739回)-(2020/06/04(Thu) 12:55:17)
No94923 (はる さん) に返信
> 先ずある条件にてのソートをし、その結果に基づきそれを優先しての、
> 次の条件にてのソートをするにはどうのようにすれば良いのでしょうか?

何をソートするときの話でしょうか?

IComparer.Compare メソッドを実装しようとしているのか、
Linq の OrderBy メソッド → ThenBy メソッドのことか…。
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.thenby


Linq のクエリ構文の話なら、Order By 第一項目, 第二項目 とか…。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/linq/how-to-sort-query-results-by-using-linq

Dim q = From cust In db.Customers
 Where cust.Orders.Count > 0
 Select cust.CustomerID, cust.CompanyName, OrderCount = cust.Orders.Count, cust.Country
 Order By OrderCount Descending, CompanyName
引用返信 編集キー/
■94931 / inTopicNo.3)  Re[2]: 二段階でのソートをするには
□投稿者/ はる (28回)-(2020/06/04(Thu) 13:53:55)
No94925 (魔界の仮面弁士 さん) に返信

> 何をソートするときの話でしょうか?

特に難しいのではなく単に数値などでのデータでのソートです。
例えば123の列でソートをし、その後に456の列でソートをするとか。

なお、複雑でしたら断念をしたいと思います。

123,abc,456
245,gdt,687
2415,djyo,2468

  


引用返信 編集キー/
■94932 / inTopicNo.4)  Re[3]: 二段階でのソートをするには
□投稿者/ ぶなっぷ (220回)-(2020/06/04(Thu) 14:25:02)
ソートには安定性という概念があります。
  https://ufcpp.net/study/algorithm/sort.html
安定なソートであれば、同じ値をもったレコード同士の順序が元のまま保たれます。

それを利用して、2回ソートを行えばいいわけです。
> 先ずある条件にてのソートをし、その結果に基づきそれを優先しての、
> 次の条件にてのソートをするにはどうのようにすれば良いのでしょうか?
ある条件にてのソートを行い、次の条件にてのソートを行います。
それだけで、うまくいくはずです。
OrderBy, ThenBy, ... とかがそのコーディング例の一つになります。

ただし、安定なソートの欠点として、ソート速度が遅いというのがあります。
クイックソートなどの高速ソートアルゴリズムを使って、同じことを行うにはどう
したらよいか?
答えはソートキーを複数フィールドの混合にしてしまうことです。

(例) 以下のようなレコードをソートすることを考えます
学年 クラス 名前
 3    4     佐藤
 2    1     鈴木
 6    3     田中
 1    5     鈴木
 2    1     田中
 4    2     佐藤

クラスは5組までしかないものとします。
そしたら、ソートキーを例えば、
  ソートキー = 学年 * 10 + クラス
として、ソートをかけます。

LINQを使うなら、以下のような感じ。
  Array.Sort(ary,
    (x, y) => (x.学年 * 10 + x.クラス).CpmpareTo(y.学年 * 10 + y.クラス));

引用返信 編集キー/
■94933 / inTopicNo.5)  Re[4]: 二段階でのソートをするには
□投稿者/ ぶなっぷ (221回)-(2020/06/04(Thu) 14:28:34)
ソート結果は以下のようになります。

学年 クラス 名前
 1    5     鈴木
 2    1     鈴木
 2    1     田中
 3    4     佐藤
 4    2     佐藤
 6    3     田中

安定じゃないソート(クイックソートなど)では、2年1組の鈴木さんと
田中さんの順序は不定です。

引用返信 編集キー/
■94937 / inTopicNo.6)  Re[5]: 二段階でのソートをするには
□投稿者/ はる (29回)-(2020/06/04(Thu) 15:51:20)
No94933 (ぶなっぷ さん) に返信

> ソートには安定性という概念があります。

それほどデータ数は多くないのです。
バブルソート、選択ソート、挿入ソートでしたら
単にそのまま2回ソートを行えば、それで良いとのことなのですね。




引用返信 編集キー/
■94938 / inTopicNo.7)  Re[6]: 二段階でのソートをするには
□投稿者/ ぶなっぷ (222回)-(2020/06/04(Thu) 16:26:05)
そうです。
引用返信 編集キー/
■94942 / inTopicNo.8)  Re[7]: 二段階でのソートをするには
□投稿者/ はる (30回)-(2020/06/04(Thu) 23:15:29)
No94938 (ぶなっぷ さん) に返信

> そうです。

ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -