[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
有点难搞,只做了个并集的,效率不错,不知道是否通用,还待测试~~~
  1. @echo off&setlocal enabledelayedexpansion
  2. set A={1,[3,6],10,[20,30],[32,60],[200,3000],5000,[6000,8000],9000,9500}
  3. set B={2,5,31,[300,500],[8000,9000],9500}
  4. ::拆分A 和 B的数据集
  5. set/a n=0,m=0
  6. set Av=!a:[=]!
  7. set Av=!Av:]="!
  8. for %%a in (%Av:~1,-1%) do (
  9. set a!n!=%%~a
  10. set/a n+=1
  11. )
  12. set Bv=!B:[=]!
  13. set Bv=!Bv:]="!
  14. for %%a in (%Bv:~1,-1%) do (
  15. set B!m!=%%~a
  16. set/a m+=1
  17. )
  18. ::设置上限
  19. set /a A!n!=2000000000
  20. set /a B!m!=2000000000
  21. ::根据a和b总项数来确定循环次,根据并集规则,进行判断重组
  22. set/a mn=m+n,n=0,m=0
  23. for /l %%a in (0,1,!mn!) do (
  24. for /f "tokens=1,2" %%m in ("!m! !n!") do (
  25. for /f "delims=," %%x in ("!A%%n!") do (
  26. for /f "delims=," %%o in ("!B%%m!") do (
  27. if %%x gtr %%o (set var=!B%%m!&set cur=m) else (set var=!A%%n!&set cur=n)
  28. for /f "tokens=1,2 delims=," %%1 in ("!var!,!var!") do (
  29. if !next! lss %%1 (
  30. if !fa! equ !end! (set aUb=!aUb!,!fa!) else (set aUb=!aUb!,[!fa!,!end!])
  31. set fa=%%1
  32. )
  33. set ben=%%1
  34. if !end! lss %%2 set end=%%2
  35. )))
  36. set /a !cur!=!cur!+1,next=end+1
  37. )
  38. )
  39. echo;并集计算:
  40. echo;AUB={!aUb:~2!}
  41. pause
复制代码
2

评分人数

    • namejm: 充分利用了for语句的一些特性,颇具技巧。速 ...PB + 10
    • zhouyongjun: 很好,效率高,很多技巧值得学习。不过一定 ...PB + 10

TOP

交集处理,在并集处理的模版改为交集的处理而已,没有多少变化。
  1. @echo off&setlocal enabledelayedexpansion
  2. set A={1,[3,6],10,[20,30],[32,60],[200,3000],5000,[6000,8002],9000,9500}
  3. set B={2,5,31,[45,49],55,[300,500],[8000,9000],9500}
  4. ::为了处理更多的情况,在楼主的例子上加了一些数据
  5. ::拆分A 和 B的数据集
  6. set/a n=0,m=0
  7. set Av=!a:[=]!
  8. set Av=!Av:]="!
  9. for %%a in (%Av:~1,-1%) do (
  10. set a!n!=%%~a
  11. set/a n+=1
  12. )
  13. set Bv=!B:[=]!
  14. set Bv=!Bv:]="!
  15. for %%a in (%Bv:~1,-1%) do (
  16. set B!m!=%%~a
  17. set/a m+=1
  18. )
  19. ::设置上限
  20. set /a A!n!=2000000000
  21. set /a B!m!=2000000000
  22. ::根据a和b总项数来确定循环次,根据交集规则,进行判断重组
  23. set/a mn=m+n,n=0,m=0
  24. for /l %%a in (0,1,!mn!) do (
  25. for /f "tokens=1,2" %%m in ("!m! !n!") do (
  26. for /f "delims=," %%x in ("!A%%n!") do (
  27. for /f "delims=," %%o in ("!B%%m!") do (
  28. if %%x gtr %%o (set var=!B%%m!&set cur=m) else (set var=!A%%n!&set cur=n)
  29. for /f "tokens=1,2 delims=," %%1 in ("!var!,!var!") do (
  30. if !end! geq %%1 (
  31. if !end! geq %%2 (
  32. if %%1 equ %%2 (set aNb=!aNb!,%%1) else (set aNb=!aNb!,[%%1,%%2])
  33. ) else (
  34. if %%1 equ !end! (set aNb=!aNb!,%%1) else (set aNb=!aNb!,[%%1,!end!])
  35. )
  36. )
  37. if !end! lss %%2 set ben=%%1&set end=%%2
  38. )))
  39. set /a !cur!=!cur!+1
  40. )
  41. )
  42. echo;交集计算:
  43. echo;aNb={!aNb:~1!}
  44. pause
复制代码

TOP

返回列表