【问题标题】:Sorting a list of strings that contains hex value对包含十六进制值的字符串列表进行排序
【发布时间】:2014-07-23 21:24:46
【问题描述】:

我有一个包含十六进制值的字符串类型列表,这些值的长度不同。因此列表可以将 FA1 和 FA 和 F9F 作为列表中的值,这取决于用户输入,我想知道对此进行排序的最佳方法是什么。

所以问题是这个列表排序后的顺序是FA1,FA,F9F,而应该是FA1,F9F,FA。

【问题讨论】:

  • 到目前为止你已经尝试过什么
  • 创建一个自定义比较器,先比较长度,然后再比较字母顺序。
  • 感谢@AlexR 的想法

标签: c# string list sorting hex


【解决方案1】:

您可以对列表进行排序并传递自定义比较函数,请参阅http://msdn.microsoft.com/en-us/library/3da4abas.aspx

该函数可以将十六进制字符串转换为常规整数并比较这些整数。转换可以在Convert.ToInt32的帮助下完成:

int n = Convert.ToInt32("FF1", 16);

http://msdn.microsoft.com/en-us/library/1k20k614.aspx

可能是这样的:

list.Sort(delegate(string lhs, string rhs)
{
    int n = Convert.ToInt32(lhs, 16);
    int m = Convert.ToInt32(rhs, 16);
    return (n > m) ? -1 : (n < m) ? +1 : 0;
});

或者(参见@AlexR 的评论)只是

list.Sort(delegate(string lhs, string rhs)
{
    return Convert.ToInt32(rhs, 16) - Convert.ToInt32(lhs, 16);
});

【讨论】:

  • 这是不必要的解析重载,因为按长度比较然后按字典顺序比较会产生相同的顺序,但不需要解析。
  • return m-n; 将具有相同的效果并且速度更快。
  • @AlexR 谢谢!更新:)。
【解决方案2】:

感谢@AlexR,我使用此代码解决了问题。

ListOfString.Sort(delegate(string temp1, string temp2)
{        
     if (temp1.Length > temp2.Length) return 1;
     else if (temp1.Length < temp2.Length) return -1;                            
     return temp1.CompareTo(temp2);
});

如果你想让它下降,只需这样做

ListOfString.Sort(delegate(string temp1, string temp2)
{        
     if (temp1.Length < temp2.Length) return 1;
     else if (temp1.Length > temp2.Length) return -1;                            
     return temp1.CompareTo(temp2) * -1;
});

【讨论】:

  • 对于像"09","100","0009" 这样的数字是如何工作的?
  • 我不认为它会,但对我来说,零在我的程序的另一部分被过滤掉了。
  • @user3813249 我想出了一个小检查来允许这种情况(见我的回答)。
【解决方案3】:

作为我评论的补充,比较代码如下所示:

int compare(string a, string b) {
    if (a.StartsWith("0")) // Short circuit if RegEx won't do anything
        a = Regex.Replace(a, "^0+", ""); // RegEx replacement of all leading 0's by ""
    if (b.StartsWith("0"))
        b = Regex.Replace(b, "^0+", "");
    if (a.Length != b.Length)
        return a.Length - b.Length; // < 0 for a < b, > 0 for a > b
    else
        return a.CompareTo(b);
}

请不要在语法上咬我,自从我们在工作中使用 Java 以来,我已经有一段时间没有用 C# 编写代码了。

【讨论】:

  • 那是一个不错的反对意见。感谢您的提示,我会解决的。
  • 什么是replaceAllcompareToCompareTo?
  • Okay does the code work now?我没有测试它,但我确信startsWith 会失败。它是StartsWith :)
  • @关于您的第一条评论,这个答案是否比简单地将字符串转换为 int 更好。 (更短?更快?更易读?)
  • 如果我们可以短路(即没有前导0s)我仍然认为它应该执行得更好(我已经看过这种基本转换背后的源代码,它相当慢)。跨度>
猜你喜欢
  • 2023-04-08
  • 2014-03-26
  • 2014-10-07
  • 2019-12-26
  • 1970-01-01
  • 2016-07-24
  • 2011-08-11
  • 2012-06-05
  • 2019-07-27
相关资源
最近更新 更多