作业帮 > 综合 > 作业

如何以一个序列顺序为基准,来排另一个组数据的顺序?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/06/01 04:46:00
如何以一个序列顺序为基准,来排另一个组数据的顺序?
比如我有一个基准序列,顺序是ST NI FL STU OL
然后我有个集合,每个对象包含了一些属性,比如
OL 3 NPT
ST 2 SA-106
STU 16 102 B7
NI 1 SA-106
ST 3 SA-106
FL 3 RF STD S-105
现在我要排序,首先按第一个属性按照上面的基准排列,如果第一个属性相等,则根据第二个属性排列,依次类推
结果如下
ST 2 SA-106
ST 3 SA-106
NI 1 SA-106
FL 3 RF STD S-105
STU 16 102 B7
OL 3 NPT
我对于程序排序的了解,基本的就冒泡排序法,以及刚又了解了些面向对象里面的Icomparable借口,Icompare接口,不过这两个接提供的演示要不是按数值大小排序,要不是按照首写字母排序,都不是我上面说的按照一个序列基准来排列
很多方法.可以用 分段匹配、格式转换、数值转换等,但无论哪种方法都很麻烦.我在排序IP地址时情况和你要求的就差不多.列如,将下面杂乱无章的IP字符串排列和你的问题是类似的:
排列前(乱序):
193.10.10.10
192.168.90.80
192.168.1.230
192.169.10.20
192.168.2.120
192.168.2.100
192.168.1.200
排列后(升序):
192.168.1.200
192.168.1.230
192.168.2.100
192.168.2.120
192.168.90.80
192.169.10.20
193.10.10.10
排列原理(数值转换比较排列)
192.168.1.200 int = 192*255*255*255+168*255*255+1*255+200 ; (值:3232235976)
192.168.1.230 int = 192*255*255*255+168*255*255+1*255+230 ; (值:3232236006)
192.168.2.100 int = 192*255*255*255+168*255*255+2*255+230 ; (值:3232236132)
192.168.2.120 int = 192*255*255*255+168*255*255+2*255+120 ; (值:3232236152)
192.168.90.80 int = 192*255*255*255+168*255*255+90*255+80 ; (值:3232258640)
192.169.10.20 int = 192*255*255*255+169*255*255+10*255+20 ; (值:3232303636)
193.10.10.10 int = 193*255*255*255+10*255*255+10*255+10 ; (值:3238660618)
这就是数值转换排序.先把要排列的数据以特定算法约束.转换成数值并将其对应绑定后,我们就不用再对原数据进行分段比较了,而是直接对它的对应绑定值进行比较就达到了排序条件目的了……
没有排序不了的数据,关键在于你以什么的算法和逻辑去约束它!
希望我手工打了这么多的字都帮助到你!晚安!
再问: 我爱百度,度娘真强大,网友好给力,谢谢了,对我有启发,等我研究下
再答: 为了方便理解,我给的例子是容易转换的IP字符串,但实际上并不是只有0-9才可以做数值转换,A-Z也一样可以。因为每个字母都有对应的键代码,比如A的键代码为65。但你的情况我并不推荐使用数值转换排序,因为须要排序的数据名称长度不固定。若使用名称分段匹配排序反而可能会简单高效的多! 希望我的回答能助你成功
再问: 名称分段匹配排序可能更简单? 能演示一下吗,不知道名称分段匹配排序是怎么个基本原理,谢谢
再答: 效率不高,通常只能用于 基准序列名称优先级规则为数不多的情况使用。否则大大影响排序效率。 原理大致如下: 第1步...创建一个 名称优先级的数组,成员的的下标和你须要的排列相对应。如:ST;NI FL;STU;OL 第2步...按 名称优先级数组 的成员数量创建对应个数的临时排序数组。如果可以,这里尽量使用多维数组。 第3步...依次循环查找排序对象中的名称是否包含当前优先级数组 的成员,若包含则复制到第2步创建的对应临时数组中。如:ST 2 SA-106 包含“ST”。那么就将排序对象插入到ST临时排序数组中 第4步...临时数组内部排序...循环取出成员名称,再取优先级规则名称右边的第1个非空字符进行键代码转换,根据转换后的数值进行.临时数组内部排序。如:ST 2 SA-106 中除“ST”右边的第1个非空字符是:“2” 第5步..将所有临时排序数组按先后顺序整合 第6步..完成
再问: 。。字数太多,那就上截图吧,-_-|| 准确是说应该是只有一个解决方案,里面可以包含多个项目,不过程序编译同时只能编译一个项目。。
再答: 以我个人的习惯,在开发设计前就先考虑整个架构的问题,分清主次关系并初步规则将来的扩展方向。其实在很多接口中我们都常常接触类似设计,比如在使用win_api的时候很多函数和结构都存在保留值。仅以Class层次划分来讲,通常可以搞主要次要、常用备用、默认可选等优先级归类。虽然我不是很确切的明了你的每个Class的作用,但如果条件允许,我可能会先定义Class1和Class2的父类,然后根据需要再定义若干个Class1_X和Class2_X的子Class。成功不是偶然的架构,架构不是偶然的成功…… 个人认为:好管理员,眼光应当放在架构上(创新上),好程序员,精力应当放在细节上(实现上)。坦诚的说,我做不了好程序员……