#include <string>
#include <set>
#include <stdio.h>
using namespace std;
class Name
{
public:
Name(const std::string & name):_name(name)
{
}
const char * data() const
{
return _name.c_str();
}
static bool is_letter(char n)
{
return (n >= 'a' && n <= 'z') || (n >= 'A' && n <= 'Z');
}
static char makeupper(char n)
{
if(n >= 'a' && n <= 'z')
{
n -= 'a' - 'A';
}
return n;
}
static int compare(char n1, char n2)
{
if(is_letter(n1) && is_letter(n2))
{
char m1 = makeupper(n1);
char m2 = makeupper(n2);
if(m1 == m2)
{
if(n1 < n2)
{
return 2;
}
else if(n1 > n2)
{
return -2;
}
else
{
return 0;
}
}
else
{
n1 = m1;
n2 = m2;
}
}
if(n1 < n2)
{
return -1;
}
else if(n1 > n2)
{
return 1;
}
else
{
return 0;
}
}
bool operator < (const Name & n) const
{
size_t len = std::min(_name.size(), n._name.size());
int ret = 0;
for(size_t i = 0; i < len ; ++i)
{
int res = compare(_name[i], n._name[i]);
switch(res)
{
case -2:
if(ret == 0) ret = -2;
break;
case -1:
return true;
case 0:
break;
case 1:
return false;
case 2:
if(ret == 0) ret = 2;
break;
}
}
if(_name.size() == n._name.size())
{
if(ret == -2)
{
return true;
}
else if(ret == 2)
{
return false;
}
}
return _name.size() < n._name.size();
}
private:
std::string _name;
};
int main()
{
std::set<Name> names;
names.insert(Name("aCB"));
names.insert(Name("AAC"));
names.insert(Name("AbC"));
names.insert(Name("Abc"));
names.insert(Name("aBC"));
names.insert(Name("aCB"));
names.insert(Name("aBc"));
names.insert(Name("abC"));
names.insert(Name("abc"));
names.insert(Name("ABc"));
names.insert(Name("aa"));
names.insert(Name("A"));
names.insert(Name("a"));
names.insert(Name("aaca"));
names.insert(Name("bcd"));
names.insert(Name("dfadsfasdf"));
names.insert(Name("ewdsfad"));
names.insert(Name("hgfdfad"));
names.insert(Name("dfasdfadf"));
names.insert(Name("dfae3rwe"));
names.insert(Name("fddfadfa"));
for(std::set<Name>::iterator it = names.begin(); it != names.end(); ++it)
{
printf("%s\n", (*it).data());
}
return 0;
}
联系人名称排序
最新推荐文章于 2020-03-10 08:59:02 发布