文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>按连续性汇总整形集合,有点儿意思。

按连续性汇总整形集合,有点儿意思。

时间:2011-04-21  来源:Leon Weng

有些算法我们在学习时会觉得枯燥无味,但是如果在实际应用中能够解决问题,就会变得很有意思。

今天在开发中遇到一个需求,将一个无序的整形集合,按数字之间的连续性进行汇总,如

3,1,2,4,9,8,10,6

这八个数按照连续性汇总后,应该生成如下形式的汇总字符串,注意是对连续的数进行了汇总

1-4,6,8-9,10

我们需要提供一个公共方法来处理这个问题:

string GetStrFromIntList(List<Int> listNumbers);

方案一 最小数累积法

那么怎么实现这个需求呢,我首先想到了一个方法:

1,循环这个集合,找出最小的数N

2,找出比N大1的数M,再按此逻辑找到比M大1的数X,以此类推,直到找出最后一个连续大1的数

3,将已找出的数剔除掉并存到另外一个集合,再继续下一轮

最开始的写法是这样的:

listTest = listTest.OrderBy(m => m).ToList();
static string GetStrByIntNumbers(List<int> listNumbers)
        {
            string strResult = string.Empty;//用作输出结果
            List<int> listTemp = new List<int>();
            int temp = 0;
            while (listNumbers.Count != 0)
            {
                temp = listNumbers.Min();//取得最小数
                listTemp.Add(temp);
                listNumbers.Remove(temp);
                var a = listNumbers.Where(m => m - 1 == temp).FirstOrDefault();//找出大于1的连续数
                if (a != 0)//如果有大于1的数则增加进连续数的集合
                {
                    listTemp.Add(a);
                }
                else //如果没有大于1的数则开始新的连续数段寻找
                {
                    var min=listTemp.Min();
                    var max=listTemp.Max();
                    if (min != max)
                    {
                        strResult += min + "-" + max;
                    }
                    else
                    {
                        strResult += min;
                    }                    
                    listTemp.Clear();
                    strResult += ",";
                } 
            }
            strResult = strResult.Substring(0, strResult.Length-1);
            return strResult;
        }
现在来使用实际的数来测试:
结果:
但是这个方法的写法实在有些繁琐,有没有更好的办法呢?您有吗?
 
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载