- 締切済み
2次元配列を複数項目でソートしたい
開発環境:Visual Web Developer 2008 express 言語:Visual Basic 制限事項:Detatableの使用は禁止 目標: 2次元配列を複数項目でソートしたい。 (1)「科目名」で昇順ソート(ソート処理(1)) (2)「氏名」で昇順ソート(ソート処理(2)) (3)「実施日」で昇順ソート(ソート処理(3)) ※並べ替えた結果を利用して色々な処理を行いたいため、表示するコントロールなどに用意された機能は使わず、内部的に並べ替えるロジックを自分で書きたいと考えています。ソート処理(1)~(3)に書くロジックをお教えいただけると助かります。 Dim results(,) As String Dim i As Integer = 0 ReDim Preserve results(3, 11) '【武田茂・国語成績】 results(0, 0) = "国語" results(1, 0) = "武田茂" results(2, 0) = "1月10日実施" results(3, 0) = "86点" results(0, 1) = "国語" results(1, 1) = "武田茂" results(2, 1) = "2月10日実施" results(3, 1) = "21点" results(0, 2) = "国語" results(1, 2) = "武田茂" results(2, 2) = "3月10日実施" results(3, 2) = "51点" '【藤代慶介・国語成績】 results(0, 3) = "国語" results(1, 3) = "藤代慶介" results(2, 3) = "1月10日実施" results(3, 3) = "86点" results(0, 4) = "国語" results(1, 4) = "藤代慶介" results(2, 4) = "2月10日実施" results(3, 4) = "21点" results(0, 5) = "国語" results(1, 5) = "藤代慶介" results(2, 5) = "3月10日実施" results(3, 5) = "51点" '【武田茂・英語成績】 results(0, 6) = "英語" results(1, 6) = "武田茂" results(2, 6) = "1月10日実施" results(3, 6) = "86点" results(0, 7) = "英語" results(1, 7) = "武田茂" results(2, 7) = "2月10日実施" results(3, 7) = "21点" results(0, 8) = "英語" results(1, 8) = "武田茂" results(2, 8) = "3月10日実施" results(3, 8) = "51点" '【藤代慶介・英語成績】 results(0, 9) = "英語" results(1, 9) = "藤代慶介" results(2, 9) = "1月10日実施" results(3, 9) = "86点" results(0, 10) = "英語" results(1, 10) = "藤代慶介" results(2, 10) = "2月10日実施" results(3, 10) = "21点" results(0, 11) = "英語" results(1, 11) = "藤代慶介" results(2, 11) = "3月10日実施" results(3, 11) = "51点" '下記をキーとして、(1)から順に昇順ソートをかける '(1)科目名 'ソート処理(1) '(2)氏名 'ソート処理(2) '(3)実施日 'ソート処理(3) よろしくお願い致します。
- vblearning
- お礼率0% (0/2)
- Microsoft ASP
- 回答数1
- ありがとう数5
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- khazad-lefty
- ベストアンサー率44% (296/668)
いくつか補足要求を。 1.なぜDataTableは禁止なのか (データベースがない環境でもDataTableを独自に定義して使用することはできます) 2.二次元配列でないといけない理由はありますか? Private Structure XX Dim Kamoku As String Dim SimeiAs String Dim Zissi As String Dim Ten As String End Structure Dim tbl As results() という感じで構造体の配列にする方が並び替えの時は楽なので 3.点数は、「~点」という文字列型で保持するのでしょうか? (文字列でソートすると「100点」は「90点」よりも小さくなります。)
関連するQ&A
- 多次元配列のソート方法
下記のような配列があったとして、 (1)科目名で昇順ソート (2)氏名で昇順ソート を行うにはどのように記述すればいいでしょうか? よろしくお願いいたします。 Dim results(2, 3) As String results(0, 0) = "国語" results(1, 0) = "武田" results(2, 0) = "90点" results(0, 1) = "英語" results(1, 1) = "藤田" results(2, 1) = "32点" results(0, 2) = "国語" results(1, 2) = "坂上" results(2, 2) = "45点" results(0, 3) = "英語" results(1, 3) = "浅木" results(2, 3) = "12点"
- ベストアンサー
- Visual Basic
- ヒープソートは2重ソートできない?
ソートに関して詳しい方、相談にのっていただけたらと思います。 CGIを使ってヒープソートするロジックを組みました。 そのルーチンはただ単項データをソートするだけでなく、たとえば、配列変数 n1 と 配列変数 n2 にそれぞれデータが入っていたとき、n1 をソートすると、それに連動して n2 の中身も一緒にソートされます。 言うならば、バラバラに並んだビデオテープを番号順に並べ替えると、一緒にタイトルも並べ変わる感じです。 ところが、配列 n1 をソートしていてたまに同じ数字が入っていることがあります。そういうときは n2 の順にしたいのです。 そこで、先に n2 をソートしてから n1 をソートするといいのではと考え、そのようにプログラムを組んでみました。 ところが実際には、n1 をソートした瞬間に、せっかく並べ替えた n2 の内容がバラバラになってしまうのです。 「n1 の内容が同じ場合は n2 を昇順に並べる」という処理を記述していても、実際には n2 の内容はバラバラです。 これはヒープソートを使用している限り仕方のないことなのでしょうか。あるいは何らかの解決方法を知っている方、よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- 多次元配列の2つ目の項目でソートするには?
今、とあるデータを csv と同じ形式で多次元配列にセットしています。 この多次元配列を for 文を使って TABLE タグを出力させて一覧表示しています。 データ部は数値順です。 function ListOut(){ var data = [ ["0x0140","CB_GETEDITSEL","エディット領域の選択範囲の取得",…], ←データは9項目ある(長いので省略) : ["0x0161","CB_INITSTORAGE","リストボックスのメモリ初期化",…], [0,0,0,0,0,0,0,0,0], ←データの最後を表す ]; for ( var i=0 ; table[i][0] != 0 ; i++ ){ ListOutSub( table, i ); ←ここで1データを TABLE 出力 } } 質問1: 『data』リストの2つ目の要素でアルファベット順にソートする方法が分かりません? ソート方法が分かれば数値順以外にもアルファベット順で ListOutSub 関数などで一覧表示できる と思っています。→データをアルファベット順にソートして定義するのは量からして避けたいです。 『sort』を使えば出来そうですが、第1引数に何を、どのように指定するのかが分かりません。 ※『ListOutSub』は自作関数で多次元配列の1データを TABLE タグで出力させるものです。 質問2: データの最後を[0,0,…,0]として終わりを判定していますが、何かよい方法ありますか? 『table.length』を使ってみましたが上手く出来ませんでした。→『i < table.length』 多次元配列の場合では『length』は使えないのでしょうか? 指定方法が間違っているのならば正しい方法を教えて下さい。 上記の2つがわかる方、どうか教えてくれませんか? ちなみに JavaScrpit は今年始めたばかりの初心者です。→参考までに C/C++ 言語歴は14年 宜しくお願いします。→回答へのお礼は夕方以降になります。
- ベストアンサー
- JavaScript
- 2次元配列で2項目についてソートのやりかたについて
こんにちは. VS2005 C++ MFC ダイアログベースでソフトを作成しています. CString型の配列 Array[100000][3] を定義し, CSVファイルから読み込んだ値を格納しています. 1列目 X座標 2列目 Y座標 3列目 結果 ファイルから読み込んだデータは以下のように y優先でxとyの値で昇順に並んでいます. _____[0] [1] [2] [0] 200 100 OK [1] 201 100 OK [2] 202 100 OK [3] 200 101 NG [4] 201 101 OK [5] 202 101 OK [6] 201 102 NG [7] 202 102 OK … これを以下のように x優先でxとyの値で昇順に並び変えたいのですが どのようにすればよいでしょうか? _____[0] [1] [2] [0] 200 100 OK [1] 200 101 NG [2] 201 100 OK [3] 201 101 OK [4] 201 102 NG [5] 202 100 OK [6] 202 101 OK [7] 202 102 OK かつ,100000行もあるのでスピードが速い方法だと助かります. 具体的なコードもお願いいたします.
- 締切済み
- C・C++・C#
- 検索結果の再ソートを試みる。
項番 商品番号 生産日 賞味期限 A B C D E 1 1 200407 200507 2 1 200307 200407 3 2 200404 200504 4 3 200406 200407 5 3 200405 200406 6 3 200404 200405 上記のテーブルがあったとして、以下の処理を実現するSQLを考えます。 1. 上記のものを、商品番号の昇順・生産日の降順(最新)でソートし、 商品番号毎に生産日が最新のものを抽出します (期待される結果:項番3、4、1の順で3つ抽出) 2. 取得したのを賞味期限の昇順にソートします ※項目は、項番商品番号生産日賞味期限の他にもABCDE……と存在するものとします。 カーソルオープン時に上記1、2を満たす事が条件です。 上記SQLの記述について、どなたか助言おねがいします。
- 締切済み
- その他(データベース)
- アクセスで曜日の並び順を変えたい
ACCESS 2003を利用しています。 曜日を昇順でソートしたいのですが、テーブルでもクエリでも昇順でソートすると「火、金、月、水、土、日、木」と表示されます。 日曜日から、もしくは月曜日から並べたいのですが、どうすればよいのでしょうか? よろしくお願いいたします。
- 締切済み
- Windows XP
- 配列データからHTMLで表を作成
PHPのソースでHTMLの表を作成したいと考えています。 $data[0][0]="01/09"; $data[0][1]="国語"; $data[0][2]="45"; $data[1][0]="01/09"; $data[1][1]="数学" $data[1][2]="85" $data[2][0]="01/08"; $data[2][1]="英語"; $data[2][2]="100"; $data[3][0]="01/08"; $data[3][1]="数学" $data[3][2]="25" $data[4][0]="01/07"; $data[4][1]="英語"; $data[4][2]="98"; $data[5][0]="01/07"; $data[5][1]="国語" $data[5][2]="60" ・ ・(いくつか続く) ・ 上記のような多次元配列から以下のようなHTMLの表を作成したいと 考えています。 ------------------------------------------- 科目 | 01/09 | 01/08 | 01/07 | ------------------------------------------- 国語 | 45 | | 60 | ------------------------------------------- 数学 | 85 | 25 | | ------------------------------------------- 英語 | | 100 | 98 | ------------------------------------------- ・ ・(幾つか続く) ・ ここで科目は上記以外に存在するとします。(社会や体育) 試験を受けていない科目は何も表示しません。 日付のみソートされて格納されています。 また科目はばらばらに格納されています。 日付についてはまた別に配列がありこれを使用しても構いません。 $hizuke[0] = "01/09" $hizuke[1] = "01/08" $hizuke[2] = "01/07" $hizuke[3] = "01/06" $hizuke[4] = "01/05" ・ ・(幾つか続く)(年をまたぐのは考えなくていいです) ・ 上記のようなデータから表を作成したいのですが ロジックがうまく組めません。 何かいい案ないでしょうか? 助けてください。m(_ _)m
- 締切済み
- PHP
- 多次元配列のソートがうまくいかない
多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }
- ベストアンサー
- Java
- 2次元配列のソートについて。
四角形を描き、X,Y方向にそれぞれ分割し、分割した辺に左下から反時計回りに番号をつけ、その辺の両端のx,yデータを書き出すというアルゴリズムを考えています。 1つの四角形ならうまくデータが取れるようになったのですが、四角形がX,Y方向に重なった時に、問題が発生してしまいます。 例えば、最初の四角形をx,y共に2分割すると辺の数は全部で8個になり上辺の番号は5,6ということになります。次にy方向に同じ形状の四角形を増やした時に、1,2(7,8)は6,5と重なるので、若い番号に書き換えます(6=7,8=5)。その次は9から始まるのではなく、書き換えた事により使っていない番号、7から書き出したいのですが、どなたか詳しい方、回答の方よろしくお願いします。 _______________________ | 5 | 11 | | | | |6 4|12 10| | | | |____3_____|____ 9____| | 3 | 9 | | | | |4 2|2 8| | | | |____1_____|____7_____| for(p=0;p<souyouso1-1;p++){ for(n=p+1;n<souyouso1;n++){ if((data[n][x1]==data[p][x2])&&(data[n][y1]==data[p][y2]) &&(data[n][x2]==data[p][x1])&&(data[n][y2]==data[p][y1])){ data[n][0]=data[p][0]; break; } } }
- ベストアンサー
- C・C++・C#
- 多次元配列のソート
過去に同様の質問があったのですが、未回答でしたので質問させていただきます。 多次元配列のうちの一つの列の値でソートし、その他の列にも結果を連動させたいのですが方法が分かりません。 たとえば、a[n][m]という配列で a[0][0]=C a[0][1]=う a[0][0]=A a[0][1]=あ a[1][0]=A a[1][1]=あ → a[1][0]=B a[1][1]=い a[2][0]=B a[2][1]=い a[2][0]=C a[2][1]=う というように、n列でソートしm列でもその結果で並べ替えたいです。 恐らくComparatorインタフェースを使用すると可能かと思うのですが、方法を教えて頂けないでしょうか。
- ベストアンサー
- Java