比较两个字母数字“数字”,任意排序

时间:2016-02-18 10:43:19

标签: c# algorithm compare

我遇到以下算法的逻辑问题:

  

比较字母数字“逐个字母”,以“字母”的顺序,按升序排列:

     

0123456789A...Z

     

示例结果:

     
      
  • V123> A789 =真(因为V> A)
  •   
  • AB123CD> 12DEF56 = true(因为A> 1)
  •   
  • AB> DE =假(因为A< D)
  •   
  • A1B2> A123 =真(因为B> 2)
  •   
  • X2Y3> X1Y5 =假(因为3 <5)
  •   
  • AB10&gt; AA23 =真(因为B> A)
  •   
  • VA20C&gt; VB10C =假(因为A&lt; B)
  •   
     

订单必须是可编辑的,以便您可以更改A&gt; Z某天,或9> B等。

我当前的算法适用于大多数测试用例,但示例中的算法仍然给我带来麻烦 - 算法将它们报告为不匹配,实际上它们应匹配。

private static string _customAlphanumericOrder = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public static bool Matches(string left_, string right_)
{
    int maxLength = Math.Max(left_.Length, right_.Length);

    left_ = left_.PadRight(maxLength, '0').ToUpperInvariant();
    right_ = right_.PadRight(maxLength, '0').ToUpperInvariant();

    for (int index = 0; index < maxLength; index++) {
        int leftOrderPosition = _customAlphanumericOrder.IndexOf(left_[index]);
        int rightOrderPosition = _customAlphanumericOrder.IndexOf(right_[index]);

        if (leftOrderPosition > rightOrderPosition) {
            return true;
        }
    }

    return false;
}

我知道我的错在某个地方,因为我过早地中止了算法,但是我无法解决如何将前面的字母结果“结转”到下一个字母的结果。

我怎样才能解开这个?

3 个答案:

答案 0 :(得分:1)

如果return false;,您还应立即leftOrderPosition < rightOrderPosition。 只有在他们平等的情况下才能继续。

答案 1 :(得分:1)

我想我会像这样更新算法(参见添加的if):

private static string _customAlphanumericOrder = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public static bool Matches(string left_, string right_)
{
    int maxLength = Math.Max(left_.Length, right_.Length);

    left_ = left_.PadRight(maxLength, '0').ToUpperInvariant();
    right_ = right_.PadRight(maxLength, '0').ToUpperInvariant();

    for (int index = 0; index < maxLength; index++)
    {
        int leftOrderPosition = _customAlphanumericOrder.IndexOf(left_[index]);
        int rightOrderPosition = _customAlphanumericOrder.IndexOf(right_[index]);

        if (leftOrderPosition > rightOrderPosition)
        {
            return true;
        }
        if (leftOrderPosition < rightOrderPosition)
        {
            return false;
        }
    }

    return false;
}

在我的例子中,如果left大于right,则算法返回true;如果left等于left,则算法返回false小于right。 然而,知道什么是预期的行为会很好。算法应该返回true并且为false?

答案 2 :(得分:1)

在ASCII表格中,数字和字母已按所需顺序显示。使用标准比较,不需要专门的算法。