アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
私はVB2005入門者です。

hoge.txtからカンマ0列目に"ABCD"且つ1行目に"T"がつく行の2,3,4列目を
nfMov_x(),nfMov_y(),nfMov_z()に格納しソートを使って
配列内の数値を降順に並び替えて、最大値を求めたいのですが
絶対値に置き換え符号を無視した処理しか出来ませんでした。


----hoge.txt----

ABCD,A1,10.5 ,8.3 , 9.5
ABCD,A2,11.5 ,7.3 , 6.5
ABCD,T1,42.5 ,-10.3 , 3.2
ABCD,T2,25.2 ,-220.2 , -1.2
ABCD,T3,-35.5 ,210.3 , -15.2

----------------

希望する取得値は下記の通りで、T3列210.3ではなくT2列-220.2のように
ソート時、符号は無視するが最終的には符号を付けた数値を取得したいのです。

Tmov_x(0) = 42.5
Tmov_y(0) = -220.2
Tmov_z(0) = -15.2


下記をどのように変更すれば良いのかわからないので、どなたか
アドバイスや添削をよろしくお願いします。


For n = 0 To 2
Dim reader As New System.IO.StreamReader("C:\hoge.txt", System.Text.Encoding.Default)
Dim nfMov_x(), nfMov_y(), nfMov_z() As Single
Do Until reader.EndOfStream
line = reader.ReadLine()
field = line.Split(",")
If field(0) = "ABCD" Then
If field(1).Trim.Substring(0, 1) = "T" Then
Do While field(4).Trim.Substring(0, 1) = "T"
ReDim Preserve nfMov_x(T_cont), nfMov_y(T_cont), nfMov_z(T_cont)
nfMov_x(T_cont) = field(2)
nfMov_x(T_cont) = Math.Abs(nfMov_x(T_cont))

nfMov_y(T_cont) = field(3)
nfMov_y(T_cont) = Math.Abs(nfMov_y(T_cont))

nfMov_z(T_cont) = field(4)
nfMov_z(T_cont) = Math.Abs(nfMov_z(T_cont))

T_cont += 1
line = reader.ReadLine()
field = line.Split(",")
Loop
ReDim Preserve nfMov_x(T_cont - 1), nfMov_y(T_cont - 1), nfMov_z(T_cont - 1), _
Tmov_x(cont), Tmov_y(cont), Tmov_z(cont)
Array.Sort(nfMov_x)
Array.Sort(nfMov_y)
Array.Sort(nfMov_z)
Array.Reverse(nfMov_x)
Array.Reverse(nfMov_y)
Array.Reverse(nfMov_z)
Tmov_x(cont) = nfMov_x(0)
Tmov_y(cont) = nfMov_y(0)
Tmov_z(cont) = nfMov_z(0)
cont += 1
T_cont = 0
ReDim nfMov_x(T_cont), nfMov_y(T_cont), nfMov_z(T_cont)
Exit Do
End If
End If
Loop
reader.Close()
Next

A 回答 (1件)

比較用の IComparerを実装したクラスを使えば符号を無視したソートが出来ますよ



Public Class myComp
  Implements IComparer
  public Funcrion Compare( byVal x as Object, byVal y as Object) As Integer _
    Implements System.Collections.IComparer.Compare
    dim dx, dy as double
    dx = Math.Abs( CType(x,Double) )
    dy = Math.Abs( CType(y,Double) )
    Return dx - dy
  End Function
End Class
といった具合に定義しておきます

テキストファイルから変うすに読み込む際には Math.Absを使わず
nfMov_x(T_cont) = field(2)
nfMov_y(T_cont) = field(3)
nfMov_z(T_cont) = field(4)
そのまま代入します

ソートをする際に
dim oComp as new myComp
Array.Sort(nfMov_x, oComp )
Array.Sort(nfMov_y, oComp )
Array.Sort(nfMov_z, oComp )

Array.Reverse( fnMov_x )
Array.Reverse( fnMov_y )
Array.Reverse( fnMov_z )
といった具合でしょう

なおmyComp.Compareの Return文の引数を dxとdyを入れ替えれば降順のソートも出来ます
    • good
    • 0
この回答へのお礼

早速のアドバイスありがとうございます。
教えて頂いた通りに書き直したところ
うまくいったのですが、
Array.Reverse( fnMov_x )
Array.Reverse( fnMov_y )
Array.Reverse( fnMov_z )
としてしまうことで、小数点第1位以下を踏まえない結果となったため
削除し、

    Return dy - dx
とすることで完璧に処理できました!

お礼日時:2008/08/18 18:11

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