第 16 楼
发表于 2008-04-30 08:37 · 中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268 发帖 879 注册 2006-12-19 16:23 19年会员 UID 73968 性别 男
状态 离线
呵,没想数字排序居然在联盟掀起第二次风波。热闹。。
也贴一段以前的代码。助助兴
:
@echo off&goto start&rem 数字排序
a.txt 中为一行一个数字
可以对任何 200 位以内的整数进行排序。(包括负数、正数、0、及重复的数字)
缺点: 对于0开头的数字,结果会忽略首位的0
::by 26933062 2007-11-25
:start
setlocal EnableDelayedExpansion
for /l %%a in (1 1 200) do set lin=0!lin!
for /f %%a in (a.txt) do (
set "str=%%a"
if "!str:~0,1!"=="-" (set fus=a&set str=!str:~1!&set zf=_) else set zf=+
set str=!lin!!str!
set !zf!!str:~-200! !random!!random!!random!!random!!random!!random!!random!=a
)
if defined fus call :sort _ /r
call :sort +
pause&exit
:sort
for /f "tokens=1,2 delims=_+= " %%a in ('set %1^|sort %2') do (
for /f "tokens=* delims=0" %%i in ("%%a") do (
if "%1"=="_" (set fuhao=-) else set "fuhao="
if "%%i"=="" (echo !fuhao!0) else echo !fuhao!%%i
)
)
goto :eof
本帖最近评分记录
(共 1 条)
点击查看详情
评分人 分数 时间
plp626
+7
2008-05-04 22:01
致精致简!
第 17 楼
发表于 2008-04-30 10:13 · 中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687 发帖 1,467 注册 2005-08-08 12:00 20年会员 UID 44210
状态 离线
从负数到正数都可以,会去除重复的数字,对于开头为0得数字不能正确处理
@echo off
setlocal enabledelayedexpansion
set str= %random% %random% -%random% %random% %random% -%random% %random% -%random% %random% %random%
::对于 a.txt 中为一行一个数字采用下一行方式读取,上一行不要
::上一行set str= %random%...的数前面必需要有一个空格
::for /f %%i in (a.txt) do set str=!str! %%i
echo 排序前数组为: %str:~1%
:sort
set num=m
for %%i in (%str%) do if %%i lss !num! set num=%%i
set ret=%ret% %num%
set str=!str: %num%=!
if not "%str%" == "" goto sort
echo 排序后数组为: %ret:~1%
pause
exit
第 18 楼
发表于 2008-04-30 16:01 · 中国 山西 运城 联通
银牌会员
★★★
天的白色影子
积分 2,343 发帖 636 注册 2004-03-06 00:00 22年会员 UID 19350 性别 男
状态 离线
简化一下terse的方案,有不足再改吧
@echo off&setlocal enabledelayedexpansion
set/p str=输入数字(用空格隔开)
for %%i in (%str%) do (
set str=0000000000%%i
set .!str:~-10! !random!=%%i
)
for /f "tokens=2 delims==" %%i in ('set .') do set/p=%%i <nul
pause>nul
本帖最近评分记录
(共 1 条)
点击查看详情
评分人 分数 时间
plp626
+5
2008-04-30 16:27
第 19 楼
发表于 2008-04-30 17:25 · 中国 湖北 武汉 电信
版主
★★★★★
积分 11,386 发帖 4,938 注册 2006-07-23 17:10 19年会员 UID 59080
状态 离线
这么热闹,我也来一段了,缺点是效率有点低……
@echo off & Setlocal EnableDelayedExpansion
for /L %%i in (1,1,5) do (
set skip=.!skip!
findstr /rc:"^^!skip!$" file.txt|sort
)
for 里面的 5 根据数字的最大位数来指定,如果不知道也可以写个for语句计算出来,我这里免去了。
本帖最近评分记录
(共 1 条)
点击查看详情
评分人 分数 时间
plp626
+15
2008-04-30 17:28
第 20 楼
发表于 2008-04-30 18:02 · 中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608 发帖 780 注册 2007-10-07 10:19 18年会员 UID 99089 性别 男
状态 离线
Originally posted by lxmxn at 2008-4-30 05:25 PM:
这么热闹,我也来一段了,缺点是效率有点低……
@echo off & Setlocal EnableDelayedExpansion
for /L %%i in (1,1,5) do (
set skip=.!skip!
findstr /rc:"^^!ski ...
版主的代码没看懂,能否解释一下?
好象不支持负数排序
第 21 楼
发表于 2008-04-30 23:14 · 中国 湖北 武汉 电信
版主
★★★★★
积分 11,386 发帖 4,938 注册 2006-07-23 17:10 19年会员 UID 59080
状态 离线
Originally posted by huahua0919 at 2008-4-30 18:02:
版主的代码没看懂,能否解释一下?
好象不支持负数排序
就是简单的根据数字位数,findstr 出从一位到五位的数,然后 sort 排序就可以了,不过前提是数字都是正整数,而且知道最大位数,严格说起来这个不算是排序~
第 22 楼
这种方法是什么原理?
发表于 2008-05-02 05:09 · 中国 北京 海淀区 联通
初级用户
★
积分 28 发帖 15 注册 2008-04-28 09:18 18年会员 UID 117150 性别 男
状态 离线
为什么加一大串零在数字前,然后在环境变量里遍历时把零又截弃掉,它们便能自动排序?
请各位大侠提点一下.
第 23 楼
还有为什么要加一些随机数?
发表于 2008-05-02 11:26 · 中国 北京 海淀区 联通
初级用户
★
积分 28 发帖 15 注册 2008-04-28 09:18 18年会员 UID 117150 性别 男
状态 离线
第 24 楼
发表于 2008-05-02 12:14 · 中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212 发帖 2,478 注册 2007-02-08 23:39 19年会员 UID 79003 性别 男
状态 离线
99
1
888
排序结果是
1
888
99
如果补0的话~结果为:
00001
00099
00888
……
第 25 楼
啊明白了,我真笨,没有想到这点
发表于 2008-05-02 12:23 · 中国 北京 海淀区 联通
初级用户
★
积分 28 发帖 15 注册 2008-04-28 09:18 18年会员 UID 117150 性别 男
状态 离线
Originally posted by MLQX at 2008-5-2 11:26 AM:
谢谢了.quote]
[ Last edited by MLQX on 2008-5-2 at 12:34 PM ]
第 26 楼
妙,好精炼的代码
发表于 2008-05-02 12:45 · 中国 北京 海淀区 联通
初级用户
★
积分 28 发帖 15 注册 2008-04-28 09:18 18年会员 UID 117150 性别 男
状态 离线
Originally posted by zh159 at 2008-4-30 01:51 AM:
以前用过的,忘了出自哪里了
@echo off
setlocal enabledelayedexpansion
set numbers=%random% %random% %random% %random% %random% %random% %random% %random%
echo 排序前 ...
来此论坛学了3 天,今天总算能看懂这段代码了.
在俺这个菜鸟看来,这种思维方法很独特.
在别人看来,也许不是独特,而是经典.
第 27 楼
点号表示什么?
发表于 2008-05-02 12:53 · 中国 北京 海淀区 联通
初级用户
★
积分 28 发帖 15 注册 2008-04-28 09:18 18年会员 UID 117150 性别 男
状态 离线
Originally posted by plp626 at 2008-4-29 11:59 PM:
if not %1.==.
难首是文本文件里隐含的结束标志?抑或是表示行首或行尾的标志?
[
Last edited by MLQX on 2008-5-2 at 01:24 PM ]
第 28 楼
再来个通用的:
发表于 2008-05-03 22:19 · 中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105 发帖 1,276 注册 2008-03-08 13:00 18年会员 UID 112398 性别 男
状态 离线
&&想不到一石激起千重浪,几天未来论坛此贴已经变成了精华贴,而且如此之火,真是非我始之所料,今天将我原来的代码又研究了下,有了如下通用性极强的化码:
@echo off&setlocal enabledelayedexpansion
set "str=101 20 14 13 19 18 16 11 5 -7"
for %%i in (%str%) do call,set var=!var! n%%i
for %%i in (%var%) do set a=%%i&call :lp
echo !var:n=!
pause>nul&goto :eof
:lp
for %%i in (!var!) do (
set b=%%i
if !b:~1! lss %a:~1% (
set var=!var:%a% =!
set var=!var:%%i=%%i %a%!
)
)
批处理之家新域名:www.bathome.net
第 29 楼
我觉得有一个人的代码最精炼:
发表于 2008-05-04 00:41 · 中国 北京 海淀区 联通
初级用户
★
积分 28 发帖 15 注册 2008-04-28 09:18 18年会员 UID 117150 性别 男
状态 离线
@echo off&for /f "delims=" %%i in ('sort /+n c.txt') do echo %%i
如果比较三位数,那么把n值改为3即可.
第 30 楼
发表于 2008-05-04 12:02 · 中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404 发帖 946 注册 2005-09-08 13:44 20年会员 UID 42345
状态 离线
Originally posted by zw19750516 at 2008-5-3 22:19:
&&想不到一石激起千重浪,几天未来论坛此贴已经变成了精华贴,而且如此之火,真是非我始之所料,今天将我原来的代码又研究了下,有了如下 ...
不通用 你这样试 set "str=1111 111 20 14 13 19 18 16 11 5 -7"
简单!简单!再简单!
论坛跳转:
— 请选择 —
站务公告 & 版主讨论
意见反馈 & 网友交流
DOS学习入门 & 精彩文章 (教学室)
DOS疑难解答 & 问题讨论 (解答室)
DOS启动盘 & LOGO技术 (启动盘室)
DOS批处理 & 脚本技术(批处理室)
DOS媒体世界 & 网络技术 (多媒体室)
DOS汉化世界 & 中文系统 (中文化室)
DOS开发编程 & 发展交流 (开发室)
DOS软件下载 & 游戏分享 (下载室)
GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区
其它操作系统综合讨论区
WinPE、PowerShell及其它命令行系统专区
贴图灌水、文学娱乐专区
网络日志(Blog)
论坛回收站
├ 链接失效,待修正