【问题标题】:Sorting digits in a string alphabetically按字母顺序对字符串中的数字进行排序
【发布时间】:2010-02-20 00:15:14
【问题描述】:

我们有一个标题列表,其中一些以数字开头(例如 5 种制作小部件的方法)。我们想在不更改标题的情况下将其分类为“五种方式……”。我们知道一些电影场所会这样做,但我无法在网上找到有关如何做到这一点的信息。有什么想法吗?

【问题讨论】:

  • 对于它的价值,大多数人不会期望它是这个顺序。数字按字母顺序排在字母之前。 Netflix 将是排序包含数字的标题的一个示例。他们把数字放在首位。雅各布
  • 哇,这完全让我失望了。

标签: c# asp.net sorting digits alphabetical


【解决方案1】:

存储原始标题和拼写出来的标题。

select OriginalTitle from Movies order by spelledTitle

另请参阅:Convert integers to written numbers

【讨论】:

  • 和我的一样。但是,您假设该列表是具有名为 Title 之类的属性的类型的对象。它可能是一个字符串列表。在这种情况下,Linq 语句不起作用。 (我也假设相同,但我们不知道,因为 OP 没有说。)
【解决方案2】:

在计算机科学中,学习编程时,有时会有一项将数字转换为文本的作业。喜欢:

526 = Fivehundredtwentysix

这可能是您在这种情况下需要的东西。

这是一个微不足道的任务,但它是一个很好的教训。

【讨论】:

    【解决方案3】:

    创建自定义比较器参见http://support.microsoft.com/kb/320727

    基本上你想要做的是测试第一个字符是否是数字。如果它不只是恢复到标准字符串比较,如果是,那么您可以进行一些额外的处理以获得数字的文本版本。

    一旦你有了这个,大多数排序算法将允许你传入比较器。

    【讨论】:

      【解决方案4】:

      扩展其他人的建议:

      1. 其中最难的部分可能是将数字转换为表示该数字的英文字符串的代码 - Sani 的编程作业。我提供了一个可能不符合您要求的简化示例。
      私有静态字符串[] digitnames = 新字符串[]
          {“哦”、“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”};
      私有静态字符串 ReplaceDigits(string s)
      {
          string convertSoFar = ""; //如果性能有问题,可以使用 StringBuilder。
          for (int charPos = 0; charPos 
      
      

      此代码将“101 dalmations”转换为“oneohone dalmations”,将“12anger men”转换为“onetwoanger men”。可以构建一个更完整的解决方案,也许来自Wedge's solution to a slightly different problem。我没有测试过那个代码,它的设计目的不是处理数字后面的字符串,但这可能是一个好的开始。

      1. 在现代 C#(我认为是 3.0 和更高版本)中,您可以将方法名称传递给 Sort,而不是显式创建 IComparable 或 IComparer。这与迈克尔的链接本质上是相同的想法。另一个相关选项是匿名lambda expression,它甚至不需要外部方法。我个人认为这样的代码读起来更干净。
      private static int NumberReplacingCompare(string strA, string strB)
      {
          返回 ReplaceDigits(strA).CompareTo(ReplaceDigits(strB));
      }
      私有静态无效输出排序字符串()
      {
          列表字符串 = new List(File.ReadAllLines(@"D:\Working\MyStrings.txt")); //从文件中拉出字符串(或者它们来自哪里
          字符串.Sort(NumberReplacingCompare); //排序,使用NumberReplacingCompare作为比较函数
          foreach(字符串中的字符串 s)
          {
              System.Console.WriteLine(s);
          }
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        相关资源
        最近更新 更多