DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ArrayList 挿入位置の取得?

環境/言語:[WindowsXP VB.NET]
分類:[.NET]

お世話に成ります
既に有るソート済のArrayListに新しく要素を追加する時の挿入ポイントに付いてヘルプでは以下のように説明があります。

Dim myIndex As Integer = myList.BinarySearch(myObject)

指定した値が ArrayList に格納されていない場合、このメソッドは負の整数を返し
ます。この負の整数に、ビットごとの補数演算 (~) を適用して、検索値よりも大き
い最初の要素のインデックスを取得できます。値を ArrayList に挿入する場合、こ
のインデックスを挿入ポイントとして使用して、並べ替え順を維持する必要がありま
す。

<<質問>>
myIndexとして -1234 が帰ってきた場合、具体的にはどうすれば正しい挿入ポイントを取得する事が出来るのでしょうか?
基本的な事なのでしょうが "ビットごとの補数演算 (~)" はVB.netではどうすれば良いのでしょうか?

宜しくお願いします。
  • 題名: Re[1]: ArrayList 挿入位置の取得?
  • 著者: java.lang.Nullpo
  • 日時: 2004/09/14 10:22:23
  • ID: 6157
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No6150に返信(突然ですがさんの記事)
> <<質問>>
> myIndexとして -1234 が帰ってきた場合、
> 具体的にはどうすれば正しい挿入ポイントを取得する事が出来るのでしょうか?
> 基本的な事なのでしょうが "ビットごとの補数演算 (~)" は
> VB.netではどうすれば良いのでしょうか?

この状況で、"ビットごとの補数演算 (~)" が必要ですか?

> 指定した値が ArrayList に格納されていない場合、このメソッドは負の整数を返し
> ます。この負の整数に、ビットごとの補数演算 (~) を適用して、検索値よりも大き
> い最初の要素のインデックスを取得できます。値を ArrayList に挿入する場合、こ
> のインデックスを挿入ポイントとして使用して、並べ替え順を維持する必要がありま
> す。

リファレンスの説明、そのまんまではないかと。
判らない場合は、実際に色々なケースで試せば、おのずとわかると思いますよ。

ソース:-------------------------------------------------------------------

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        Dim nArray() As String = {"C", "VB", "Assembler", "Delphi", "Java", "Perl"}
        Dim i        As Integer

        Array.Sort(nArray)

        Console.WriteLine("ソート後:")
        For i = 0 To nArray.Length - 1
            Console.WriteLine(i.ToString() & ":" & nArray(i))
        Next i

        Console.WriteLine("「C++」が挿入されるべき場所は、" & Array.BinarySearch(nArray, "C++") * -1 - 1)
        Console.WriteLine("「VB.NET」が挿入されるべき要素は、" & Array.BinarySearch(nArray, "VB.NET") * -1 - 1)
        Console.WriteLine("「SmallTalk」が挿入されるべき要素は、" & Array.BinarySearch(nArray, "SmallTalk") * -1 - 1)
    End Sub

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


出力結果:-----------------------------------------------------------------

  ソート後:
  0:Assembler
  1:C
  2:Delphi
  3:Java
  4:Perl
  5:VB

「C++」が挿入されるべき要素は、2
「VB.NET」が挿入されるべき要素は、6
「SmallTalk」が挿入されるべき要素は、5

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

# 質問内容の意味を曲解していたら申し訳ありません。m(_ _)m
2004/09/14(Tue) 10:46:20 編集(投稿者)

■No6150に返信(突然ですがさんの記事)

言い忘れたことがありました。

> 指定した値が ArrayList に格納されていない場合、
> このメソッドは負の整数を返します。

の通り、同じValueの要素が既に存在している場合は正数で返ってくるので
そのことは考慮して下さい。

> この負の整数に、ビットごとの補数演算 (~) を適用して、検索値よりも大き
> い最初の要素のインデックスを取得できます。

確かに、MSDNにも同じように記載されていますね。
なるほど、そういう意味だったのですね。
確かにビットを反転したものを求めれば、符号が反転しますね。(1の補数)
そういえば、組込みをやらされてた時に頻繁に使ってたなぁ。



余計な世話ですが、

 「突然ですが」という名前って微妙かも...

 http://dobon.net/vb/bbs/index.html#manners

 > 匿名(通りすがり、初心者などの名前も匿名と同じです)にせず、一貫した名前を使うこと。

とあります。
2004/09/14(Tue) 11:03:21 編集(投稿者)

■No6158に返信(java.lang.Nullpoさんの記事)

>>この負の整数に、ビットごとの補数演算 (~) を適用して、検索値よりも大き
>>い最初の要素のインデックスを取得できます。
> しかし、この"ビットごと"が、わかんないですね...。

 『ビットごとの補数演算を適用する』ということは『 1 の補数を求める』ということですね。
 VB.NET では論理演算子とビット演算子が同じなので、 Not 演算子を用います。


# この辺りにも一度目を通しておくと良いかも知れません。>元質問者さま
各言語の演算子の比較
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsintro7/html/vxorilanguageequivalentskeywords.asp


# あ、もう編集されてるw
■No6159に返信(深山さんの記事)
> # あ、もう編集されてるw

あ、ごめんなさいっ (w
いつものクセです。(カキコした後に限って気付く)
java.lang.Nullpoさん、深山さん、有難う御座います。
おかげで参考に成りました、まだまだ勉強が足りないですね。

myList.BinarySearch(myObject)*-1-1 と
Not(myList.BinarySearch(myObject)) は同じなんですね、

>・・・・・という名前って微妙かも...
以後何か考えます。

又宜しくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板