配列内の検索

解決


nao  2004-05-24 07:22:08  No: 113454  IP: [192.*.*.*]

VB.NETです。配列内に特定の要素が存在するかどうかを調べるにはどうすればいいのでしょうか。

編集 削除
特攻隊長まるるう  2004-05-24 09:19:20  No: 113455  IP: [192.*.*.*]

System.Array.BinarySearch メソッド
を使ってみるとか?。

編集 削除
nao  2004-05-24 12:08:34  No: 113456  IP: [192.*.*.*]

やってみたのですが、

Dim i() As Integer = {1, 2, 2, 5, 5}
        If Array.BinarySearch(i, 10) Then
            Debug.WriteLine("OK")
        End If

これでOKがでてしまうのですが、どうすればいいのでしょうか。

編集 削除
魔界の仮面弁士  2004-05-24 13:05:12  No: 113457  IP: [192.*.*.*]

# 「Option Strict On」モードにしておけば、間違いにすぐに気が付いたかも。

BinarySearchメソッドの戻り値は、Booleanではありません。
見つかった位置を整数で返すだけです。見つからなかった場合は、負数を返します。

なお、同じ値が複数含まれていた場合でも、返される位置は、
いずれか一つだけです。詳細は SDK で確認してみてください。

編集 削除
特攻隊長まるるう  2004-05-24 13:10:28  No: 113458  IP: [192.*.*.*]

魔界の仮面弁士さんのおっしゃる通り、ヘルプに[解説]・[使用例]が載ってます。
それを読むという事は『関数を正しく使う』という事です。
それを読まないという事は『関数を正しく使う気が無い』という事です。
正しく使う気が無いなら、他人様の用意してくれた関数など使わず
配列の要素を1個1個取り出して、文字列の比較をして下さい。
(…それさえもある程度は関数を使うことになるでしょうが、
間違った使い方が出来ないほど単純なものであれば大丈夫でしょう)
自分の力量に合わせた方法でコーディングして下さい。

自分勝手な使い方は、時に貴方の開発環境を壊すでしょう。
悪いことは言いません。自分のためです。使えない関数は
使わないようにしましょう。

編集 削除
nao  2004-05-25 08:23:55  No: 113459  IP: [192.*.*.*]

解決しました。まだまだ勉強が足りないってことですね。
出直してきます。

編集 削除
特攻隊長まるるう  2004-05-26 04:32:27  No: 113460  IP: [192.*.*.*]

勉強不足なだけなら別に問題ないと思うんですよ。
ここは初心者掲示板ですし…分からないだけならいいんです。
でもnaoさんのコーディングはちょっと厄介なんです。

えーっと…ヘルプ(MSDNライブラリ)の検索方法は分かりますよね?
関数を選択して[F1]キーを押すだけです。1秒と掛かりません。
関数について仕様の確認をするのにも10分と掛からないでしょう。
それをしないのは勉強不足だとかいうレベルの話ではないと思います。
やる気がないんです。

別にやる気がないだけならいいんです。一番の問題は
やる気のない人が中途半端な知識でコーディングすることです。
例えば今回、
>        If Array.BinarySearch(i, 10) Then
>
>これでOKがでてしまうのですが、
なぜOKが出るかと言うと、魔界の仮面弁士さんのおっしゃる通り
>BinarySearchメソッドの戻り値は、Booleanではありません。
…という事なんですが、更に悪いことに、[VB.NET]で True
って -1 なんですよね(正確には 0 以外の値はすべて True に
なります。Boolean 型についてヘルプ見てください)
MSDNライブラリがインストールされてないとかいう無謀な
環境で開発されている方のために↓
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vadatboolean.asp

今回は
># 「Option Strict On」モードにしておけば、間違いにすぐに気が付いたかも。
ということもあるのですが、もし「Option Strict On」モードでエラー
が出るからって
        If CBool(Array.BinarySearch(i, 10)) Then
なんてされたら最悪。こーいったバグは見つけるのに非常に苦労
する場合があるんです…エラーとして検出されませんから。
しかも『関数の戻り値を If 文で使う』という知識はあるんですよ?。
しかし肝心の戻り値がどんなものか確認してない。…これって非常に
無責任なコーディングだと思います。

こーゆーコーディングする人とは一緒にプロジェクト組みたく
ないですね。自分の管理化の人間だったら即クビ。…そこまで
いかなくても確実に開発チームのメンバーからは外れてもらいます。
将来的に物凄く迷惑を掛けられる可能性が非常に高いですから。
そーゆーレベルの話です。勉強不足だとかは関係ないです。

編集 削除
名前なし  2004-05-26 12:12:54  No: 113461  IP: [192.*.*.*]

ちょっと言い過ぎじゃねー?

編集 削除
test  2004-05-26 13:08:33  No: 113462  IP: [192.*.*.*]

気持ちはわかります。
特にその人のせいでデスマーチと化してたら・・
不毛なバグを埋め込まれるのはつらいものです。

ただ、1回の失敗でPjからはずすというのも酷い
のでは。3回やったらそりゃぁクビですが・・

まぁ今回naoさんは
「解らないときには掲示板ではなくF1を押す」
「PGが動かない時は本質的な原因を掴む必要がある」
という事を理解されて一歩前進したと思います。

編集 削除
特攻隊長まるるう  2004-05-26 13:30:35  No: 113463  IP: [192.*.*.*]

…はい。そうですね。ゴメンナサイm(__)m
過去の記憶が甦ってきてしまって十分に感情を抑えられません
でした。
誰にでも間違いはあります。少なくとも3回までは待つことにします。

編集 削除
ねろ  2004-05-26 14:46:27  No: 113464  IP: [192.*.*.*]

今回の特攻隊長まるるうさん「Option Strict」 が「On」になっていたかも。(^^;
ただし理由がしっかり書かれているので、耳が痛いのを我慢すれば、大変参考になりますね。
ところでこのBinarySearch ですが、二分木検索ですよね、
最初に配列をソートしておく必要がありますね。
naoさんお忘れなく。

編集 削除