[英]Batch: How to use an array with a variable as an index inside a for loop?
我的代碼讓客戶輸入一系列單詞(直到客戶輸入“0”),將它們存儲在一個數組中,然后按字母順序對該數組進行排序。 我找到了一種方法,可以通過使用額外的 for 循環來使我的代碼正常工作,但我對這種方法不滿意,請問您還有其他替代方法嗎? (帶有 %%h 的那個)
我的問題來自%%tab[!next!]%%
並且我需要再延遲一次,當我使用CALL echo
時它有效但我不知道如何處理 if 條件和集合。
先感謝您。
ps:對從 1 開始的數組和 for 循環感到抱歉,但這讓我又跳過了 1 個 goto 和計算循環索引+1 的努力。
@echo off
setlocal enableDelayedExpansion
set /a num=0
:newVar
set /a num+=1
set /p tab[%num%]=Write something:
if not !tab[%num%]! == 0 goto newVar
set /a num-=1
echo.
echo Array length: %num%
echo.
set varTemp=ERROR
set /a nbTours=%num%-1
FOR /L %%v IN (1 1 %nbTours%) DO (
echo ***********************************************
echo.
set /a nbComparaison=%num%-%%v
set /a next=1
FOR /L %%i IN (1 1 !nbComparaison!) DO (
set /a next=next+1
call echo tab[%%i] = !tab[%%i]! . tab[!next!] = %%tab[!next!]%%
FOR %%h in (!next!) do (
if !tab[%%i]! GTR !tab[%%h]! (
echo ________ !tab[%%i]! ^<-^> !tab[%%h]! & echo.
set varTemp=!tab[%%h]!
set tab[%%h]=!tab[%%i]!
set tab[%%i]=!varTemp!
)
)
)
echo.
)
echo ***********************************************
echo.
echo result:
FOR /L %%d IN (1 1 %num%) DO (
echo tab[%%d] = !tab[%%d]!
)
endlocal
pause
擴展延遲變量以在代碼塊中用作索引的更有效方法是使用簡單for
循環:
For %%G in (!next!)Do echo(tab[%%i] = !tab[%%i]! . tab[%%G] = !tab[%%G]!
如果代碼塊中需要多個延遲變量作為索引變量,可以使用for /f
循環來擴展和隔離所需的標記。
For /l %%i in (1 1 10) Do (
Set /A Next=%%i+1,Previous=%%i-1
For /f "tokens=1,2,3 delims=;" %%G in ("!Pevious!;!Next!;%%i") Do (
Echo(%%G - %%H - %%I
)
)
FOR /L %%v IN (1,1,%num%) DO IF (%%v neq %num%) FOR /L %%i IN (%%v,1,%num%) DO IF (%%v neq %%i) IF "!tab[%%v]!" gtr "!tab[%%i]!" (
SET "vartemp=!tab[%%v]!"
SET "tab[%%v]=!tab[%%i]!"
SET "tab[%%i]=!vartemp!"
)
對於每個條目,除了最后一個條目,對於每個剩余條目(具有較高索引的條目)進行比較並在需要時交換。
將剩余條目中最低的放入索引%%v
中,直到完成。
請注意,需要在引號中執行字符串比較,以迎合包含空格的條目,並為字符串分配set "var=value"
,以確保分配的值中不包含尾隨空格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.