自定义的排序方法

一般情况下JS的排序利用Array的sort方法:

 

 

arrayobj.sort(sortfunction) 
 

针对一些特殊的排序要求,还可以自定义sortfunction:

 

 

 

如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一: 

负值,如果所传递的第一个参数比第二个参数小。 
零,如果两个参数相等。 
正值,如果第一个参数比第二个参数大。 
 

这里提供一个按字母顺序排序的方法,由于某个字母大小写的ASCII码不同,所以不能用'<','>'比较。因此用一个Object来定义字符顺序,注意顺序完全按照自己的需求定义:

 

var character = {
                0: -2,
		1: -1,
		2: 2,
		3: 3,
		4: 4,
		5: 5,
		6: 6,
		7: 7,
		8: 8,
		9: 9,
				
                a: 11,
                A: 12,
                b: 13,
                B: 14,
                c: 15,
                C: 16,
                d: 17,
                D: 18,
                e: 19,
                E: 20,
                f: 21,
                F: 22,
                g: 23,
                G: 24,
                h: 25,
                H: 26,
                i: 27,
                I: 28,
                j: 29,
                J: 30,
                k: 31,
                K: 32,
                l: 33,
                L: 34,
                m: 35,
                M: 36,
                n: 37,
                N: 38,
                o: 39,
                O: 40,
                p: 41,
                P: 42,
                q: 43,
                Q: 44,
                r: 45,
                R: 46,
                s: 47,
                S: 48,
                t: 49,
                T: 50,
                u: 51,
                U: 52,
                v: 53,
                V: 54,
                w: 55,
                W: 56,
                x: 57,
                X: 58,
                y: 59,
                Y: 60,
                z: 61,
                Z: 62
            };
 

在这个基础上,构建判断两个单词的大小的sortfunction:

 

 

 function compare(str1, str2,/*Boolen, compare with chinese?*/isChinese){
                console.info('compare');
                str1 = dojo.trim(str1);
                str2 = dojo.trim(str2);
                i = 0; 
		var s1 = str1.charAt(i);
           	var s2 = str2.charAt(i++);			
				
                while (s1) {
//					if(isChinese){
//						 
//						console.info('in chinese:')
//						if( s1>= 0x4E00 && s1 <= 0x9FA5){
//							alert('s1 chinese!')
//							//s1,s2 both chinese,compare ASCII
//							if(s2 >= 0x4E00 && s2 <= 0x9FA5){
//								alert('s2 chinese!')
//								if(s1<s2){
//									return -1;
//								}else if(s1>s2){
//									return 1
//								}else{
//									continue;
//								}
//							}else{
//								//s2 is not chinese,s1 is bigger
//								return 1;
//							}
//						}else if(s2 >= 0x4E00 && s2 <= 0x9FA5){
//							//s2 is chinese,s1 isn't chinese, s2 is bigger
//							alert('s2 chinese!')
//							return -1;
//						}
//						//none of s1,s2 is chinese,to normal process 
//					}
 					if(!s2){
						return 1;
					}
					//special character sort by ASCII order
               		if(!character[s1]){
						if(!character[s2]){
							if(s1<s2){
								return -1;
							}else if(s1>s2){
								return 1;
							}else{
								s1 = str1.charAt(i);
                            s2 = str2.charAt(i++);
								continue;
							}
						}else{
							return -1;
						}
					}else if(!character[s2]){
						return 1;
					}
					
					//alphabet and number
                    if (character[s1] < character[s2]) {
                        return -1;
                    }
                    else 
                        if (character[s1] > character[s2]) {
                            return 1;
                        }
                        else {
                            s1 = str1.charAt(i);
                            s2 = str2.charAt(i++);
                        }
                }
				if(!s2){
					return 0;
				}
                return -1;
            }

 

当然这个方法不一定只用于Array的sort中,也可以在自定义数据结构中使用,比如linklist,double linklist..

### 如何在编程中实现自定义排序方法 为了实现在编程中按照特定需求对数据进行排序的功能,可以采用多种方式来定制排序逻辑。对于不同编程语言而言,具体的方法有所差异。 #### 使用 C++ 自定义比较器 在 C++ 中,可以通过向 `std::sort` 函数传递第三个参数作为自定义的比较函数来进行排序操作[^1]。此比较函数接收两个待比较的对象并返回布尔值表示前者是否应排在后者之前。下面是一个简单的例子展示如何基于对象的一个属性(假设为整数类型)创建升序排列: ```cpp struct Record { int key; }; bool compareRecords(const Record &a, const Record &b) { return a.key < b.key; // 升序条件 } // 调用 std::sort 并传入自定义比较器 std::vector<Record> records = /* 初始化记录 */; std::sort(records.begin(), records.end(), compareRecords); ``` 如果要处理更复杂的数据结构或不同的数据类型,则可以根据实际情况调整上述模板中的成员变量名和比较表达式。 针对字符串类型的字段 `attr` 进行排序的情况,在 JavaScript 或其他支持动态特性的语言里可以直接利用内置的 `.localeCompare()` 方法完成字典顺序上的对比;而在静态类型的语言如 C++ 中则需注意字符编码等问题以确保正确性[^2]。 另外值得注意的是,当涉及到容器内元素位置交换时,某些标准库可能提供了专门用于此类场景下的工具——例如 C++ 的 `<algorithm>` 头文件里的 `swap_ranges` 和 `iter_swap` 等辅助功能可以帮助简化代码编写过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值