如何把已知的數組元素刪除?


如何把已知的數組元素刪除,但是索引不變。例如:
dim a(5)as string
a(0)="aa"
a(1)="bb"
a(2)="cc"
a(3)="dd"
a(4)="ee"

…… <--這行應該如何刪除?

返回結果:
a(0)="aa"
a(1)="bb"
a(3)="dd"
a(4)="ee"

數組a的元素個數變成4,但是原始索引不變。

23 个解决方案

#1


不行,
但,有必要這樣做嗎?

#2


非常有必要!!
我把2副bmp圖像分別copy到2個數組中,然后進行數組比較,把相同的部分刪除……

#3


用另一個數組做標記,記錄對應的元素是否已刪除

#4


把數組聲明成可變數組,在要改變數組大小時用Preserve關鍵字的Redim語句聲明。
如:
aa(3)=aa(4)
redim preserve aa(0 to 3)

#5


建議用集合,用KEY選擇。

#6


非常感謝樓上的幾位:

to  lingll(20分) 
能給我舉例說明嗎?

to FSoft()
您的方法我也想過,但是我不想改變元素的索引。還有其他的辦法嗎?

to northwolves(野性的呼喚) 
不好意思,集合怎么用?能簡單的舉個例子嗎? 

#7


假設你原來的數組是 a(1 to n) , 
現在再dim一個數組, b(1 to n) as boolean
對b所有元素賦初值,true

想要刪除a(i)的時候,將b(i)=false即可,
以后訪問a中元素的時候,判斷對應b中的元素是否true即可
(false,a中元素已刪除,true,未刪除)

#8


to  lingll(20分)
謝謝!
我編寫了一個桌面共享程序,在S端把桌面傳輸到C端,如果每次都把整個屏幕傳輸過來速度非常慢,哪怕是壓縮后。我采取把屏幕直接保存到數組(不保存成文件,避免讀寫硬盤耽誤時間),然后發送。不理想的是數組也同樣大(數組的大小等於屏幕分辨率*4),我不知道該如何壓縮數組。以前在網上看過Delphi的一篇文章,說的就是采用差異傳輸法,把有過變化的部分傳輸過去。也就是我的數組比較,把相同的部分刪除,但是必須保留剩余部分的索引,否則傳輸過去程序根本不知道把它顯示在哪。
你的這種方法從根本上說就沒有刪除……

哪位高手能給小弟指點一二,小弟不勝感激。

#9


寫個循環 把后面的元素往前挪
再ReDim


你學過《數據結構》沒有?
這是很基礎的 線性表 操作

#10


to 樓上
謝謝!關鍵的問題是我不想讓元素的索引改變呀,如果“寫個循環 把后面的元素往前挪 再ReDim”結果就不是我想要的了。

#11


那再建立一個標志數組
用於標志元素是否存在

#12


謝謝樓上:
我主要是用於網絡傳輸,最終的目的是要把數組減小到最小,如果建立一個標志數組好像並沒有使我的數組減小。

#13


先計算更新區域,把他規格化到一個Rect中
發送Rect
再發送數據

最好去學圖像壓縮算法:GIF_LZW、JPEG

#14


謝謝 zyl910(910:分兒,我又來了!)
我看了很多關於圖像壓縮算法的文章,它們把bmp文件經過計算壓縮后另存為另外格式的文件。請問有沒有什么方法把內存中的bmp直接壓縮,我的源碼如下:

聲明:
Option Explicit
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long


操作:
Dim Bytes() As Byte  '圖像緩沖區
Dim hScreen As Long  '屏幕句柄
Dim hScene As Long   '內存場景
Dim hBitmap As Long  '屏幕圖像
Dim BmpByte As Long  '圖像字節數
Dim W As Long, H As Long
'獲得分辨率
W = Screen.Width \ Screen.TwipsPerPixelX
H = Screen.Height \ Screen.TwipsPerPixelY
'獲得當前屏幕句柄
hScreen = GetDC(0)
'創建與當前屏幕一致的內存場景
hScene = CreateCompatibleDC(hScreen)
'創建與當前屏幕一致的位圖
hBitmap = CreateCompatibleBitmap(hScreen, W, H)
SelectObject hScene, hBitmap
'把本機的即時屏幕圖象復制到內存
BitBlt hScene, 0, 0, W, H, hScreen, 0, 0, vbSrcCopy
'顯示內存圖像
'StretchBlt hScreen, 0, 0, W - 2, H, hScene, 0, 0, W, H, vbSrcCopy
'將屏幕位圖的二進制位復制到緩沖區
ReDim Bytes(W * H * 4)
BmpByte = GetBitmapBits(hBitmap, UBound(Bytes), Bytes(0))

'Bytes就是我的圖像數據,是bmp格式的,在這里能直接壓縮嗎?
'或者在這里產生與前一副圖像的差異,就是刪除與其相同的數組元素。

'釋放占用的資源
ReleaseDC 0, hScreen
DeleteDC hScene
DeleteObject hBitmap

如果您有更好的建議請指教。

#15


只要你懂GIF_LZW、JPEG壓縮算法
你可以直接對內存中的位圖數據進行壓縮

#16


非常感謝zyl910(910:分兒,我又來了!)
我對GIF_LZW、JPEG不是很明白,利用vb好像有些困難,您能給我一點示例嗎?vb方面的。

#17


這里有一篇關於delphi的文章,其中說到了圖像壓縮和傳輸的方法,后面提及到了只傳輸差異部分,我不知道在vb中能否實現其中的壓縮和解壓縮步驟。
差異部分如果拋棄我的數組比較的笨方法,還有那些更好的方法?
http://zeroworld.html.533.net/program/mystream.htm

#18


並不是實現很困難
而是現在又太多的人被控件的光環所迷惑
不願意去學習底層的技術


http://www.fantasiasoft.net/Zyl910/zSaveGIF.zip
我以前寫的GIF編碼/解碼程序(當時是為ThirdApple寫的,最開始只有編碼的功能)

#19


謝謝,我先去研究一下……

#20


別用GetBitmapBits
那是DDB位圖數據
與硬件有關

用GetDIBits得到DIB位圖數據
是規格的,設備無關的

#21


您的代碼好高深喲,我被看的糊里糊塗的。

#22


我倒是覺得你可以換一種角度來考慮問題
你可以監視所有狀態為可視窗口,並截取他們的wm_paint消息
只有重繪才需要你改變數據
其它的按照 拷屏——處理數據——傳輸 流程處理即可

需要傳輸的不光有屏幕數據,還有窗口的坐標和zorder等數據
至於處理數據,你可以參考jpeg壓縮算法的第一步,應該能夠壓縮掉很多

#23


謝謝樓上的仁兄,能詳細的描述一下你的方法嗎?比如……

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com