質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2372閲覧

【.NET】 配列の指定区間内の最大最小を求める方法

momo842

総合スコア7

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/10/05 09:35

前提・実現したいこと

お世話になります。

.NETの配列に関してです。

実現させたい内容は、配列の指定区間の最大値・最小値を求めるプログラムです。
a(0)~a(9),a(10)~a(19),....~a(99)の計10区間それぞれの最大最小を求めます。

プログラムがやたら長い(酷い)ので、もっと効率の良い方法はないかご助言の程お願い致します。

現状は以下のように求めております。(例)
指定区間をnで区切り、for next でひたすら比較して、同区間を2周して最大最小を求めています。
余りにも幼稚な殴り書きプログラムですが、一応暫定策...

VBnet

1Public Sub saidai() 2 3 Dim maxV1,maxV2,maxV3 ...(省略)... maxV10 as integer = 0 4 Dim minV1,minV2,minV3 ...(省略)... minV10 as integer = 0 5 Dim a() as integer '0 ~ 99 まである 6 7 For n = 0 to 9 8 If a(n) > maxV1 then 9 maxV1 = a(n) 10 End If 11 Next 12 13 For n = 0 to 9 14 If a(n) < minV1 then 15 minV1 = a(n) 16 End If 17 Next 18 19 20   For n = 10 to 19 21 If a(n) > maxV2 then 22 maxV2 = a(n) 23 Next 24 25 26  '................(省略)................ 27 28 For n = 90 to 99 29 If a(n) < minV10 then 30 minV10 = a(n) 31 Next 32 33 34'その後maxV1~minV10を別演算で使用している。 35 36 37End Sub 38 39 40

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

LINQを使って元の配列を10ごとに分割してそれぞれで最小・最大を求める方法もあります。

vbnet

1Dim a() as integer '0 ~ 99 まである 2 3'10個ごとに分割する 4Dim groups = a.Select(Function(v, i) New With {.Value = v, .Index = i}) _ 5 .GroupBy(Function(v) v.Index / 10) _ 6 .Select(Function(g) g.Select(Function(v) v.Value)) 7 8'各グループごとの最大値と最小値を求める 9Dim maxs = groups.Select(Function(g) g.Max()) 10Dim mins = groups.Select(Function(g) g.Min())

投稿2020/10/05 14:49

draq

総合スコア2573

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momo842

2020/10/06 23:28

ご回答ありがとうございます。 LINQ...初めて知りました... 今後の参考にします!
guest

0

ベストアンサー

提示されたソースを殆ど変更せずに少しだけ短縮するとすれば、

VBNET

1 For n = 0 to 9 2 If a(n) > maxV1 then 3 maxV1 = a(n) 4 End If 5 Next 6 7 For n = 0 to 9 8 If a(n) < minV1 then 9 minV1 = a(n) 10 End If 11 Next

このように最大値、最小値を求めているところを

VBNET

1 For n = 0 to 9 2 If a(n) > maxV1 then 3 maxV1 = a(n) 4 End If 5 6 If a(n) < minV1 then 7 minV1 = a(n) 8 End If 9 Next

こうすれば、少し無駄なループが減ります。

これ以上の改善点となると、最大値、最小値を格納する変数を配列化する。
こうすることで、ループが使いやすくなります。

VBNET

1 Dim maxV(9) As Integer, minV(9) As Integer 2 3 For i = 0 To 9 4 '最大値、最小値の初期化 5 maxV(i) = Integer.MinValue 6 minV(i) = Integer.MaxValue 7 8 For j = 0 To 9 9 10 If maxV(i) < a(i * 10 + j) Then 11 maxV(i) = a(i * 10 + j) 12 End If 13 If minV(i) > a(i * 10 + j) Then 14 minV(i) = a(i * 10 + j) 15 End If 16 17 Next 18 19 Next

ArraySegment<T>構造体を使って必要部分を切り出して、Enumerable.MaxメソッドEnumerable.Minメソッドを使用するようにするともっと短くできるでしょう。

投稿2020/10/05 10:44

YAmaGNZ

総合スコア10288

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momo842

2020/10/06 23:29

ご回答ありがとうございます。 誰でも使える構文の範囲で、効率が良くて尊敬です… しっかり頭使うようにします笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問