人に聞けない痔の悩み、これでスッキリ >>

開発環境: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)

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

いくつか補足要求を。



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点」よりも小さくなります。)
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q多次元配列のソート方法

下記のような配列があったとして、
(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点"

下記のような配列があったとして、
(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) = ...続きを読む

Aベストアンサー

画像を見た感じだと、
> Dim results(2, 3) As String

――というデータ構造を採用した時点で、いけてないような。
Type Result_T: Seito As String: kamoku As String: ten As Integer: End Type
みたいなユーザ定義型を作って処理したほうがよいかと。

ADOとか使ってよいなら、ADODB.Recordsetに突っ込めばソートも一発でできそうな。

どうしても絶対にresults(2, 3)を使わなきゃいけないのだとしたら、比較後のデータ交換時にその配列間でデータを入れ替えればよいだけかと。

どういうアプローチを取ってよいか問題の出題範囲を確認してみては。

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

Q2次元配列の初期値

こんにちは
VBで2次元配列に初期値をまとめて入れる方法がわからなくて困っています。
簡単なはずなのにわかりません。
教えてくれるようお願いします。

Aベストアンサー

田吾作7です。

あぁーすいません。
初期化だと思ってて、勘違いしてました。すいません。。。
初期化ではなく、初期値のセットですね。。。

Variant型でもよければ
  dim wkAryas Variant'バリアント宣言
  wkAry = Array(Array(10, 100, 42, 90), Array(50, 30, 60, 30))
といった形でできます。



もし何度も同じ初期値をセットする必要があるのであれば、メモリコピーをお勧めします。
それが一番リソースを消費しない方法だと思います。
以下にソースを記します。
手順1.二次元配列の初期値のマスタを作成(CreAryMst)
手順2.ワークの二次元配列に初期値をセット(InitAry)
手順3.ワークを使用したロジックの実行(ユーザの処理)
手順4以降は手順2または手順3の処理の繰り返し

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private mstAry(1, 3)  As Long '二次元配列の初期値のマスタ
Private matrixCount   As Long '配列要素数

Sub Main()
  Dim wkAry(1, 3)   As Long '実際に操作する二次元配列
  
  '二次元配列の初期値マスタを創生
  Call CreAryMst
  
  '変数に初期値をセットする
  Call InitAry(wkAry(0, 0))
  
End Sub

'二次元配列の初期値マスタを創生
Sub CreAryMst()
  Dim dmyAry As Variant
  Dim i    As Long
  Dim j    As Long
  
  Dim min1  As Long
  Dim max1  As Long
  Dim min2  As Long
  Dim max2  As Long
  
  min1 = LBound(mstAry, 1)
  max1 = UBound(mstAry, 1)
  min2 = LBound(mstAry, 2)
  max2 = UBound(mstAry, 2)
  
  '配列要素数を取得
  matrixCount = (max1 - min1 + 1) * (max2 - min2 + 1)
  
  '初期値をダミー変数にセット
  dmyAry = Array(CLng(10), CLng(50), CLng(100), CLng(30), CLng(42), CLng(60), CLng(90), CLng(30))
  
  '初期値をセットする
  For i = min1 To max1
    For j = min2 To max2
      mstAry(i, j) = dmyAry(i * max2 + j)
    Next j
  Next i
End Sub

'変数に初期値をセット
Sub InitAry(inLngAryTop As Long)
  Call CopyMemory(inLngAryTop, ByVal VarPtr(mstAry(0, 0)), ByVal LenB(inLngAryTop) * matrixCount)
End Sub




こうすることにより、初期値のセットが一瞬で済むので、初期値セット毎にかかる負荷が抑えることができます。

田吾作7です。

あぁーすいません。
初期化だと思ってて、勘違いしてました。すいません。。。
初期化ではなく、初期値のセットですね。。。

Variant型でもよければ
  dim wkAryas Variant'バリアント宣言
  wkAry = Array(Array(10, 100, 42, 90), Array(50, 30, 60, 30))
といった形でできます。



もし何度も同じ初期値をセットする必要があるのであれば、メモリコピーをお勧めします。
それが一番リソースを消費しない方法だと思います。
以下にソースを記します。
手順1.二次元配列...続きを読む

Qupdate文で改行を入れる

こんにちは。
いつもお世話になっています。

update文を使用して、データに改行を入れたいのですが、どうすればよいでしょうか。

対象列のデータ型はVARCHAR2です。

例えばSQLPLUSから、
SPL>update 「テーブル名」set 「対象列」='あ改行い改行う改行'
を投入し、そのあと
select 「対象列」 from 「テーブル名」
とすると
SQL>あ
SQL>い
SQL>う
と出てくればよいんですが、
SQL>update 「テーブル名」set 「対象列」='あ\nい\nう\n'
としても
SQL>あ\nい\nう\n
と、「\n」が文字列としてでてきてしまいます。

SPL>update 「テーブル名」set 「対象列」='あ
2い
3う'
と投入すると、期待通りになるのですが、
そうではなく一行にまとめたいのですがどうすれば良いでしょうか。

Oracle9iを使用しています。
宜しくお願いいたします。

Aベストアンサー

こんにちわyukio200263さん
以下のSQL文でどうでしょうか?

UPDATE 「テーブル名」
SET 「対象列」= 'あ' || CHR(13) || CHR(10) ||'い'

ちょっと長くなってしまいますが、一行で可能です。

QSystem.IO.Directory.GetFilesの順番

For Each strFileName As String In Directory.GetFiles("フォルダ名","*.TXT")
'なにか処理
Next strFileName


としてファイル名を読み込んで処理する場合、ファイル名でソートされて順番に出てくるような気がします。
どのような基準でソートされるのかを調べているのですが、はっきり明記されているものが見つかりません。

安心して使うために裏付けがほしいのですが、どこかに詳細な資料はないでしょうか?
よろしくお願いします。

Aベストアンサー

内部的に FindFirstFile / FindNextFile を使っているようだけど
http://www.microsoft.com/japan/msdn/net/general/win32map.asp

取得する順番は..
http://forums.belution.com/ja/vc/000/038/23.shtml

なるほど!

正式情報は
http://msdn.microsoft.com/library/en-us/fileio/fs/findnextfile.asp

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical order. With FAT file systems, the names are returned in the order the files were written to the disk, which may or may not be in alphabetical order.

内部的に FindFirstFile / FindNextFile を使っているようだけど
http://www.microsoft.com/japan/msdn/net/general/win32map.asp

取得する順番は..
http://forums.belution.com/ja/vc/000/038/23.shtml

なるほど!

正式情報は
http://msdn.microsoft.com/library/en-us/fileio/fs/findnextfile.asp

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical or...続きを読む

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

QVB.NETでのnothing の意義について

 VB.NET(.NET環境)ではガーベジコレクションがあるので、オブジェクトの解放はそれほど気を使わなくても良いようですが、やはり明示的に解放したいときがあります。

 例えば下記のようにオブジェクトを解放してから確保したいときなどです。

objMyFile As clsMyFileClass = New clsMyFileClass("SAMPLE1.TXT")
objMyFile.Write("TEST")
objMyFile = Nothing ←ここで解放したい
objMyFile = New clsMyFileClass("SAMPLE2.TXT")
objMyFile.Write("TEST")

 このクラスの Finalize でファイルクローズするようにした場合、Nothing を代入しても Finalize が実行されないようです。

 また、GC.Collect()を使用すると他のオブジェクトのコレクションも実行されるので、ちょっと大げさな感じがします。

 Open と Close メソッドを追加すれば解決しますが、せっかくなので New と Finalize で処理するようにしたいです。なお、VB.NET 2003なのでUsing も使えません。

 VB.NET(.NET環境)ではガーベジコレクションがあるので、オブジェクトの解放はそれほど気を使わなくても良いようですが、やはり明示的に解放したいときがあります。

 例えば下記のようにオブジェクトを解放してから確保したいときなどです。

objMyFile As clsMyFileClass = New clsMyFileClass("SAMPLE1.TXT")
objMyFile.Write("TEST")
objMyFile = Nothing ←ここで解放したい
objMyFile = New clsMyFileClass("SAMPLE2.TXT")
objMyFile.Write("TEST")

 このクラスの Finalize でファイルクローズ...続きを読む

Aベストアンサー

どんなにがんばっても、明示的に開放することはできません。
nothingすることは、オブジェクトをその変数が参照していない事を示す以外の目的では使えません。
GC.Collect() しても、開放されるかどうか確定しているわけではありません。
open/closeメソッドを追加しても、finalizeしても、解決しません。
表向き使えなくなっているだけで、実際に開放されるかどうかは、.NET Frameworkまかせです。

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?

QDataGridViewのチェックボックスのON、OFFの判定方法

お世話になります。ご協力お願いします。
環境:VS2008 .Net FrameWork3.5
言語:C#

質問内容:ボタンを押下したら、DataGridViewの列に設定したチェックボックスのON,OFFを判定して処理を行いたい。
現状以下の方法で実現は出来ていますが、とても回りくどい方法になっています。
正しい処理を教えて頂けないでしょうか。

1.DataGridViewにて、列にチェックボックスを設けている。
2.truevaluesプロパティにtrueをセットしている。

ボタンを押下したらチェックボックスのON、OFFを判定する為に、DataGridViewの行を
ループさせて判定させています。

for(int i=0;i < DataGridView.Count;i++){
___if((string)DataGridView.Rows[i].Columns[0].values == "true")
___{
______処理
___}
}

お願い致します。

Aベストアンサー

 こんばんは。

 正しいかどうかは断言出来ませんが、要はチェックボックスの「on, off」を確認しながらループするのが非効率的なので、ループ回数を「on」の個数だけに留めたいと言う事でしょうか。

 でしたら、以下URLに記載されているイベントハンドラを応用して、
 http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html

 セルのチェックボックスが「on, off」された瞬間に、セルのROW番号をハッシュテーブルに向かって「登録、解除」をしていけば、結果として「on」になっているセルのROW番号だけを保持する事になります。

 「Dictionaryジェネリッククラス」
 http://msdn.microsoft.com/ja-jp/library/xfhwa508(VS.80).aspx

 以下参考程度に。

//ハッシュテーブル(trueのROW番号だけを記録するDictionary<Key, Value>だが、今回の事例では両方とも同じROW番号を入れる)
private Dictionary<int, int> boolMapper;

private void Form1_Load(object sender, EventArgs e)
{
//作成
this.boolMapper = new Dictionary<int, int>();
}

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (this.dataGridView1.CurrentCellAddress.X == 0 && this.dataGridView1.IsCurrentCellDirty)
{
this.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}

//チェックボタンが「on, off」された瞬間に呼ばれるイベントハンドラ
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0 && this.dataGridView1.Columns[e.ColumnIndex].ValueType == typeof(bool))
{
//チェックボタンが「on」になったのでハッシュテーブルに登録
if ((bool)this.dataGridView1[e.ColumnIndex, e.RowIndex].Value == true)
{
this.boolMapper.Add(e.RowIndex, e.RowIndex);
}
//チェックボタンが「off」になったのでハッシュテーブルから除外
else
{
this.boolMapper.Remove(e.RowIndex);
}
}
}

//ボタン1を押した時に呼ばれるイベントハンドラ
private void button1_Click(object sender, EventArgs e)
{
//ハッシュテーブルの要素個数分だけ回転する
foreach(KeyValuePair<int, int> kvp in this.boolMapper)
{
//ココで何かする「kvp.Value / kvp.Key」どちらにも同じ数字が入っているのでどちらを使用するかは問わない
this.dataGridView1[0, kvp.Value];
}
}

 こんばんは。

 正しいかどうかは断言出来ませんが、要はチェックボックスの「on, off」を確認しながらループするのが非効率的なので、ループ回数を「on」の個数だけに留めたいと言う事でしょうか。

 でしたら、以下URLに記載されているイベントハンドラを応用して、
 http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html

 セルのチェックボックスが「on, off」された瞬間に、セルのROW番号をハッシュテーブルに向かって「登録、解除」をしていけば、結果として「on」になっ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング