首页 新闻 会员 周边 捐助

不同字符排序

0
悬赏园豆:20 [已解决问题] 解决于 2015-11-04 11:17

var arr = new[] { "+2", "+1", "▲59", "▲77", "▲58", "3", "2", "10", "" };

现有这样一数组, 想要排序成{1,2,3,+1,+2,+3,▲1,▲2,▲3,"",""},其中▲符号可能是其他字符;

我想了一个笨办法,就是分别把这4种类型,分别提出进行排序,然后按顺序排列成一数组。

想问问各位有没更好的办法

阳.咩咩的主页 阳.咩咩 | 初学一级 | 园豆:4
提问于:2015-11-03 11:49
< >
分享
最佳答案
1

需要自定义排序方法,然后先判断首位,如果不一致,直接排出先后,如果一致,再调用默认排序。大体上跟你使用的方式差不多。

收获园豆:20
幻天芒 | 高人七级 |园豆:37207 | 2015-11-03 13:22

现在弄出来大概是

Main{

  var numArr = {3,2,1};

  var numPlus = {+3,+2,+1};

  var numOther = {L1,L3,L2};

  List.AddRange(Sort(numArr));
  List.AddRange(Sort(numPlus));
  List.AddRange(Sort(numOther));

如果写成一个方法,应该写个判断在递归里面按照先后顺序执行?

再一个就是sort用的是插入法,而实际数数据里差不多过W,这里效率考量会怎么样?

阳.咩咩 | 园豆:4 (初学一级) | 2015-11-03 13:36
static List<string> Sort(string[] list)
        {
            for (int i = 1; i < list.Length; ++i)
            {
                var curStr = list[i];
                int t = 0;
                var charS = string.Empty;
                int result;
                if (int.TryParse(curStr, out result) && !curStr.Contains("+"))
                    t = result;
                else if ((curStr.Contains("+") || curStr.Contains("")) ||
                    (!string.IsNullOrEmpty(curStr) && !int.TryParse(curStr, out result) &&
                    !(curStr.Contains("+") || curStr.Contains(""))))
                {
                    t = int.Parse(curStr.Substring(1, curStr.Length - 1));
                    charS = curStr[0].ToString();
                }

                var j = i;
                while ((j > 0))
                {
                    var preStr = list[j - 1];
                    if ((preStr.Contains("+") || preStr.Contains("")) ||
                        (!string.IsNullOrEmpty(preStr) && !int.TryParse(preStr, out result) &&
                        !(preStr.Contains("+") || preStr.Contains(""))))
                    {
                        var preNum = int.Parse(preStr.Substring(1, preStr.Length - 1));
                        if (t < preNum)
                            list[j] = string.Format("{0}{1}", preStr[0], preNum);
                        else
                        {
                            break;
                        }
                    }
                    else if (int.Parse(preStr) > t)
                    {
                        list[j] = preStr;
                    }
                    else
                        break;
                    --j;
                }
                list[j] = string.Format("{0}{1}", charS, t);
            }
            return list.ToList();
        }
阳.咩咩 | 园豆:4 (初学一级) | 2015-11-03 13:41

@阳.咩咩: 

private static void Main(string[] args)
        {
            var arr = new[] { "+2", "+1", "▲59", "▲77", "▲58", "3", "2", "10", "" };
            Array.Sort(arr, (s, s1) =>
            {
                var sValue = GetStringValue(s);
                var s1Value = GetStringValue(s1);
                if (sValue != s1Value)
                {
                    return sValue - s1Value;
                }
                return String.CompareOrdinal(s, s1);
            });
            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine(arr[i]);
            }
            Console.ReadKey();
        }

        private static int GetStringValue(string s)
        {
            int result = 1;
            if (string.IsNullOrEmpty(s))
            {
                result = 4;
            }
            else if (s.Substring(0, 1) == "")
            {
                result = 3;
            }
            else if (s.Substring(0, 1) == "+")
            {
                result = 2;
            }
            return result;
        }

我也写了一段代码,你可以看看。

幻天芒 | 园豆:37207 (高人七级) | 2015-11-03 15:12

@幻天芒: 非常感谢,代码看起精简多了,也非常直观。

但是10,和2,3比较char有点问题

阳.咩咩 | 园豆:4 (初学一级) | 2015-11-04 10:49

@幻天芒: 

Array.Sort(lstStr, (s, s1) =>
            {
                var sValue = GetStringValue(s);
                var s1Value = GetStringValue(s1);
                if (sValue != s1Value)
                {
                    return sValue - s1Value;
                }
               //改为数字另行判断
                int o,o1;
                if (int.TryParse(s, out o) && int.TryParse(s1, out o1))
                    return o > o1 ? 1 : -1;

                return string.CompareOrdinal(s, s1);
            });    
阳.咩咩 | 园豆:4 (初学一级) | 2015-11-04 11:16

@阳.咩咩: 数字类的判断,如果是字符串类型的话,是默认比较ASCII码的,如果要想"2" < "11",那么就可以转换为数字然后再比较。

幻天芒 | 园豆:37207 (高人七级) | 2015-11-04 13:35
其他回答(1)
0

你直接写一个arr的排序方法,没必要去都取出来,可是1,2,3,+1,+2,+3,▲1,▲2,▲3你是什么规则排序该好好考虑下,如:string.Empty这类型的扩展方法

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-11-03 12:55

排序规则就是:数字,'+',其他符号,empty

支持(0) 反对(0) 阳.咩咩 | 园豆:4 (初学一级) | 2015-11-03 13:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册