#include<iostream>
using namespace std;
int compare(char *s1,char *s2,int *hash)
{
int len1=strlen(s1);
int len2=strlen(s2);
for(int i=0,j=0;i<len1&&j<len2;++i,++j)
{
if(hash[s1[i]]<hash[s2[j]])
return 1;
else if(hash[s1[i]]>hash[s2[j]])
return -1;
else
continue;
}
}
int main()
{
char *s[4]={"bed","dog","dear","eye"};
char *p="dgecfboa";
//构建一个按照p中元素的位置大小的hash数组,字符越在前面对应的hash值越大
int count=0;
int hash[521]={0};
while(*p!='\0')
hash[*p++]=++count;
//排序
for(int i=0;i<3;++i)
{
int max=i;
for(int j=i+1;j<4;++j)
{
if(compare(s[max],s[j],hash)==-1)
{
max=j;
}
}
char *temp=s[i];
s[i]=s[max];
s[max]=temp;
}
for(int j=0;j<4;j++)
printf("%s ",*(s+j));
return 0;
}
解题思路:将待排序字符串存入vector<string>strArry中,然后使用sort对strArry按字符串长度由小到大排序,sort中的比较方法为compareStrLen。再使用sort对strArry按给定的字符优先级排序,排序方法为 compareCharPriority。findIndex用来查找待排序字符串首字符在给定字符优先级中的位置。 #include <QtCore/QCoreApplication> #include <iostream> #include <algorithm> #include <vector> using namespace std; string charPriority = "dgecfboa"; //确定的字符优先级
//将字符串按从大到小顺序排序 bool compareStrLen(const string &str1, const string &str2) { return str1.length() > str2.length(); } //查找待排序字符串首字母在charPriority的位置 int findIndex(char ch) { return charPriority.find(ch); }
//按charPriority中的字符顺序排序 bool compareCharPriority(const string &str1, const string &str2) { return findIndex(str1[0]) < findIndex(str2[0]); }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); string str[] = {"bad", "dog", "dear", "eye"}; //加入待排序字符串 vector<string> strArry(str,str+sizeof(str)/sizeof(str[0])); //按字符串长度由大到小排序 sort(strArry.begin(),strArry.end(),compareStrLen); //按charPriority的优先级排序 sort(strArry.begin(),strArry.end(),compareCharPriority); //输出已经排序好的字符串 for (vector<string>::size_type i = 0; i < strArry.size(); ++i) { cout << strArry[i] << endl; } return a.exec(); }
package Qunar;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
/**
* 已知字母序列【d, g, e, c, f, b, o, a】,
* 请实现一个函数针对输入的一组字符串 input[] = {"bed", "dog", "dear", "eye"},
* 按照字母顺序排序并打印。
* @author xia
*思路:
* 要按照给定的字符顺序进行排序,1.首先将字符装入到哈希表中,并给出相应的值
* 2.使用Arrays的sort方法,重写compare方法
* 在方法中,获取字符串中每个字符在哈希表中对应的值
* 进行值相减
* 如果相减结果为0,说明两个字符是相同的,那么继续比较下一个字符
* 否则返回相减的结果
* 如果两个字符串的每个字符都相等,那么返回两个字符串的长度差
*/
public class SortForString {
/**
* 排序方法
* @param array
*/
public void sort(String [] array){
//判断传入的数组是否为空
if(array==null || array.length<0){
return;
}
final Map<Character,Integer> map = new HashMap<Character, Integer>();
//将给定的字符装入到map集合中
map.put('d', -8);
map.put('g', -7);
map.put('e', -6);
map.put('c', -5);
map.put('f', -4);
map.put('b', -3);
map.put('o', -2);
map.put('a', -1);
//对传入的数组使用Arrays工具类进行排序,重写compare方法
Arrays.sort(array, new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
//遍历字符串,对每个字符进行排序,排序的规则是:
//如果获取的字符在我们定义的字符序列中,就按照对应的value排序,如果要排序的字符不在
//我们定义的字符中,就按照该字符的ascll进行排序
for(int i=0;i<str1.length()&&i<str2.length();i++){
Integer a=map.get(str1.charAt(i));
int a1=a!=null?a:str1.charAt(i);
Integer b=map.get(str2.charAt(i));
int b1=b!=null?b:str2.charAt(i);
if(a1==b1)
continue;
else
return a1-b1;
}
//如果要比较的字符全部都相等,则按字符串的长度排序
return str1.length()-str2.length();
}
});
}
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
String[] array={"bed", "dog", "dear", "eye"};
SortForString s = new SortForString();
s.sort(array);
//遍历数组,查看结果
for(int i=0;i<array.length;i++){
if(i==array.length-1){
System.out.print(array[i]+"]");
}else if(i==0){
System.out.print("["+array[i]+",");
}
else{
System.out.print(array[i]+",");
}
}
}
}
先写一个按照字母序列顺序比较的函数。然后每个字符串排序,先比较长度,短的在前面,长的在后面,长度相等的逐个字母比较