按指定排序规则排序,求算法

VAllens 2017-06-15 02:56:27
现有一组由若干个小组组成的数据,
每小组的数据的前缀为"Name-", "Age-", "Address-", "Phone-",且每小组的数据后缀都是一致的。
string[] data = new []
{
"Name-1", "Age-1", "Address-1", "Phone-1",
"Age-2", "Name-3", "Address-2", "Phone-2",
"Name-2", "Age-3", "Address-3", "Phone-3"
};
需要将上面的数组按照以下排序规则排序,且排序后的每小组后缀都是一致的。
string[] sort = new [] { "Age-", "Phone-", "Address-", "Name-" };
最终得到结果是:
string[] data = new []
{
"Age-1", "Phone-1", "Address-1", "Name-1",
"Age-2", "Phone-2", "Address-2", "Name-2",
"Age-3", "Phone-3", "Address-3", "Name-3"
};
求算法。
...全文
297 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38092265 2017-06-15
  • 打赏
  • 举报
回复
建议楼主看下LINQ的相关知识,排序数组比较容易, 可以传递自定义的比较器,相对灵活, 代码如下,两种方法逻辑完全相同的, 优先按照数字,然后按照索引排序, 语法不一样而已

using System;
using System.Linq;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] data = new[]
                {
                "Name-1", "Age-1", "Address-1", "Phone-1",
                "Age-2", "Name-3", "Address-2", "Phone-2",
                "Name-2", "Age-3", "Address-3", "Phone-3"
                };
            string[] sort = new[] { "Age", "Phone", "Address", "Name" };

            //查询表达式
            var query1 = (from value in data
                          let split = value.Split('-')
                          orderby split[1], Array.IndexOf(sort, split[0])
                          select value)
                         .ToArray();

            //点标记
            var query2 = data
                .Select(x => new { x, y = x.Split('-') })
                .OrderBy(x => x.y[1])
                .ThenBy(z => Array.IndexOf(sort, z.y[0]))
                .Select(value => value.x)
                .ToArray();

            foreach (var item in query1)
            {
                Console.WriteLine(item);
            }

            foreach (var item in query2)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
    }
}
VAllens 2017-06-15
  • 打赏
  • 举报
回复
引用 8 楼 diaodiaop 的回复:
所以呢.. 你自己会... 然后.... 无形了炫了一下技术....
当然,如果有哪位同学,能够用"算法"得到结果,那就更好了。 感激不尽。
VAllens 2017-06-15
  • 打赏
  • 举报
回复
引用 8 楼 diaodiaop 的回复:
所以呢.. 你自己会... 然后.... 无形了炫了一下技术....
不好意思,我同时问了Q群里的人,有个人点醒了我,说这根本不需要算法。 然后我就相通了,顺便贴出所谓的"答案"。 如果这让你误解,我只能说抱歉,无心炫耀。
by_封爱 版主 2017-06-15
  • 打赏
  • 举报
回复
所以呢.. 你自己会... 然后.... 无形了炫了一下技术....
VAllens 2017-06-15
  • 打赏
  • 举报
回复
其实不用算法也能解决问题。

            string firstSort = sorts[0];
            var suffixList = new List<string>();
            foreach (var item in data)
            {
                var tmp = item.Split('-');
                if (tmp[0] == firstSort) 
                {
                    suffixList.Add(tmp[1]);
                }
            }

            var list = new List<string>();
            foreach (var suffix in suffixList) 
            {
                foreach (var item in sorts)
                {
                    list.Add(item + "-" + suffix);
                }
            }

            foreach (var x in list)
            {
                Console.WriteLine(x);
            }
VAllens 2017-06-15
  • 打赏
  • 举报
回复
引用 5 楼 wanghui0380 的回复:
splite(",","A1,B1,C1,D1").orderby(p=>",C,A,B,D".indexof(","+p)) 因为你只是要一个字母打头的所以,我就不用正则取了,如果你的情况比较复杂,你可以用正则匹配位置,按位置排序
这位兄弟用的是哪种语言写出来的。
wanghui0380 2017-06-15
  • 打赏
  • 举报
回复
splite(",","A1,B1,C1,D1").orderby(p=>",C,A,B,D".indexof(","+p)) 因为你只是要一个字母打头的所以,我就不用正则取了,如果你的情况比较复杂,你可以用正则匹配位置,按位置排序
VAllens 2017-06-15
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
        static void Main(string[] args)
        {
            string[] data = 
            { 
                "Name-1", "Age-1", "Address-1", "Phone-1",
                "Age-2", "Name-3", "Address-2", "Phone-2",
                "Name-2", "Age-3", "Address-3", "Phone-3"
            };
            string[] sort = { "Age", "Phone", "Address", "Name" };

            Array.Sort(data, (a, b) =>
                {
                    var k = string.Compare(a.Split('-')[1], b.Split('-')[1]);
                    if (k == 0)
                    {
                        return Array.FindIndex(sort, x => x == a.Split('-')[0]) - Array.FindIndex(sort, x => x == b.Split('-')[0]);
                    }
                    return k;
                });

            foreach (var x in data) Console.WriteLine(x);
        }
结果有误差,不能这样排。 再说个排序规则: string[] sort = { "Name", "Age", "Phone", "Address" }; 最终得到结果是: string[] data = new [] { "Name-1", "Age-1", "Phone-1", "Address-1", "Name-3", "Age-3", "Phone-3", "Address-3", "Name-2", "Age-2", "Phone-2", "Address-2", }; PS:注意后缀。
xuzuning 2017-06-15
  • 打赏
  • 举报
回复
        static void Main(string[] args)
{
string[] data =
{
"Name-1", "Age-1", "Address-1", "Phone-1",
"Age-2", "Name-3", "Address-2", "Phone-2",
"Name-2", "Age-3", "Address-3", "Phone-3"
};
string[] sort = { "Age", "Phone", "Address", "Name" };

Array.Sort(data, (a, b) =>
{
var k = string.Compare(a.Split('-')[1], b.Split('-')[1]);
if (k == 0)
{
return Array.FindIndex(sort, x => x == a.Split('-')[0]) - Array.FindIndex(sort, x => x == b.Split('-')[0]);
}
return k;
});

foreach (var x in data) Console.WriteLine(x);
}
VAllens 2017-06-15
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
嗯,作为学生题目的你自己做 而作为实际项目,没人管你。数据是数据,显示是显示。如果你非要说你们的客户端显示不是自己控制的,而是让后端给他拼接成table输出,我只能说还是你自己写。 split sortby(p=>p.indexof(array)) 话说我还真见过有些前端人滴非要求后端的人给他拼成table输出滴,原因是懒(或者是不会前端控制),这样的人一般就一个字“---开”
和前后端无关,可能是数据让你误以为是前端的显示问题。 其实我只是在求算法。 以下是待排序的数据。 A1,B1,C1,D1, C2,D2,D3,C3, A3,A2,B2,B3. 当指定排序为A,B,C,D时, 结果是: A1,B1,C1,D1. A3,B3,C3,D3. A2,B2,C2,D2. 当指定排序为C,A,B,D时, 结果是: C1,A1,B1,D1, C2,A2,B2,D2, C3,A3,B3,D3.
wanghui0380 2017-06-15
  • 打赏
  • 举报
回复
嗯,作为学生题目的你自己做 而作为实际项目,没人管你。数据是数据,显示是显示。如果你非要说你们的客户端显示不是自己控制的,而是让后端给他拼接成table输出,我只能说还是你自己写。 split sortby(p=>p.indexof(array)) 话说我还真见过有些前端人滴非要求后端的人给他拼成table输出滴,原因是懒(或者是不会前端控制),这样的人一般就一个字“---开”

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧