如何通过将非数字字符串转换为整数来对它们进行排序?有没有办法在订购时将字符串转换为唯一的整数?

How to sort non-numeric strings by converting them to integers? Is there a way to convert strings to unique integers while being ordered?

我正在尝试将字符串转换为整数并根据整数值对它们进行排序。这些值对于字符串应该是唯一的,没有其他字符串应该能够产生相同的值。如果 string1 大于 string2,则它的整数值应该更大。例如:因为“orange”>“apple”,“orange”应该有一个更大的整数值。我该怎么做?

我知道 'a' 和 'b' 之间有无数种可能性,但我并不想将每一种可能性都归入一个数字。我只是想尽可能地排序,比如 100 万个值,而不是无限量。

我能够使用以下方法获得唯一的值:

long int order = 0;
for (auto letter : word)
    order = order * 26 + letter - 'a' + 1;
return order;

但这显然不起作用,因为“apple”的值将大于“z”的值。

这不是作业或拼图,这是我自己想到的。感谢您的帮助,谢谢!

您可以使用字符的位置:

std::string s("apple");
int result = 0;
for (size_t i = 0; i < s.size(); ++i)
    result += (s[i] - 'a') * static_cast<int>(i + 1);
return result;

顺便说一下,您正在尝试获得与哈希函数非常相似的东西。

您快完成了...只需要进行一些小的调整:

  1. 你乘以 26

    但是你有字母 (a..z) 和空 space 所以你应该乘以 27 !!!

  2. 添加零填充

    为了使起始字母成为最重要的数字,您应该 zeropad/align 字符串的共同长度...如果您使用 32 位整数,则字符串的最大大小为:

    floor(log27(2^32)) = 6
    floor(32/log2(27)) = 6
    

这里是小例子:

int lexhash(char *s)
    {
    int i,h;
    for (h=0,i=0;i<6;i++) // process string
        {
        if (s[i]==0) break;
        h*=27;
        h+=s[i]-'a'+1;
        }
    for (;i<6;i++) h*=27; // zeropad missing letters
    return h;
    }

返回这些:

  14348907      a
  28697814      b
  43046721      c
 373071582      z
  15470838    abc
 358171551    xyz
  23175774  apple
 224829626 orange

按哈希排序:

  14348907      a
  15470838    abc
  23175774  apple
  28697814      b
  43046721      c
 224829626 orange
 358171551    xyz
 373071582      z

这将处理所有长度不超过 6 个字符的小写 a..z 字符串,即:

26^6 + 26^5 +26^4 + 26^3 + 26^2 + 26^1 = 321272406 possibilities

对于更多,只需为散列使用更大的位宽。如果您也使用它的最高位,请不要忘记使用无符号类型(32 位不是这种情况)