求解:对一组字符数组按照自定义的字母顺序排序应该如何做
求解:对一组字符数组按照自定义的字母顺序排序应该怎么做
比如:字母优先级是 d, f, e, c, a . 然后字符数组是str={"deec","dac","ceef","fee"};输出的是"deec","dac","fee","ceef"
------解决方案--------------------
python写了一个。
priority为字符串到int的映射表,keyfunc返回sorted函数用于比较的主键。
sorted对字符串slist的所有键排序,结果在result中。
------解决方案--------------------
先写个最基础的函数,参数是两个字母,返回bool,通过这个函数确定字母的优先级,然后需要实现字符串排序函数
------解决方案--------------------
做个表吧
char alphaorder[26]= {......};//自定义顺序
------解决方案--------------------
给每个字母重新定义权值,类似于:
int right[26] = { xx, xx, xx, ... , xx };
对于楼主举的这个例子:d, f, e, c, a
可以这样做:
int right[26] = {1, 0, 2, 5, 3, 4, 0, 0, ...., 0};
一个新的字符串比较的函数:
我这个写的只是举个例子,希望能起到抛砖引玉的效果
------解决方案--------------------
比如:字母优先级是 d, f, e, c, a . 然后字符数组是str={"deec","dac","ceef","fee"};输出的是"deec","dac","fee","ceef"
------解决方案--------------------
>>> priority = {'d':0, 'f':1, 'e':2, 'c':3, 'a':4 }
>>> def keyfunc(str):
return priority[str[0]]
>>> slist = {'deec', 'dac', 'ceef', 'fee'}
>>> result = sorted(slist, key = keyfunc)
>>> result
['dac', 'deec', 'fee', 'ceef']
python写了一个。
priority为字符串到int的映射表,keyfunc返回sorted函数用于比较的主键。
sorted对字符串slist的所有键排序,结果在result中。
------解决方案--------------------
先写个最基础的函数,参数是两个字母,返回bool,通过这个函数确定字母的优先级,然后需要实现字符串排序函数
------解决方案--------------------
做个表吧
char alphaorder[26]= {......};//自定义顺序
------解决方案--------------------
给每个字母重新定义权值,类似于:
int right[26] = { xx, xx, xx, ... , xx };
对于楼主举的这个例子:d, f, e, c, a
可以这样做:
int right[26] = {1, 0, 2, 5, 3, 4, 0, 0, ...., 0};
一个新的字符串比较的函数:
int mystrcmp( const char *str1, const char *str2)
{
while (*str1 && *str2 && *str1++ == *str2++) ;
if ('\0' == *str1 && '\0' == *str2) return 0;
if ('\0' == *str1 ) return -*str2;
if ('\0' == *str2 ) return *str1;
return right[*str1 - 'a'] - right[*str2 - 'a'];
}
我这个写的只是举个例子,希望能起到抛砖引玉的效果
------解决方案--------------------
//字母优先级是 d, f, e, c, a . 然后字符数组是str={"deec","dac","ceef","fee"};输出的是"deec","dac","fee","ceef"
#include <stdio.h>
#include <string.h>
int od(char c) {
char *p;
char order[6]="dfeca";
if (0==c) return -1;
p=strchr(order,c);
if (NULL==p) return -1;
return p-order;
}
int cmp(char *s1,char *s2) {
int od1,od2;
while (1) {
od1=od(*s1);
od2=od(*s2);
if (od1<od2) return -1;
if (od1>od2) return 1;
if (-1==od1 && -1==od2) return 0;
s1++;
s2++;
}
}
int main() {
char *str[4]={"deec","dac","ceef","fee"};
char *t;
int i,j;
for (i=0;i<4-1;i++) {
for (j=i+1;j<4;j++) {
if (1==cmp(str[i],str[j])) {
t=str[i];str[i]=str[j];str[j]=t;
}
}
}
for (i=0;i<4-1;i++) printf("\"%s\",",str[i]);
printf("\"%s\"",str[i]);
return 0;
}
//"deec","dac","fee","ceef"