我想了解IComparer如何在以下程序中工作

时间:2017-03-08 13:29:32

标签: .net c#-4.0 icomparer

给定一组数字,以产生最大值的方式排列它们。 例 {} 54,546,548,60 该安排是6054854654给出的最大值。

self

输出为60 548 546 54。 我需要了解IComparer如何对此数组进行排序

提前致谢

2 个答案:

答案 0 :(得分:0)

代码的要点是尝试通过连接整数列表来找到最大可能的数字。如果你把这个逻辑分解为只有两个数字,比如前两个([65,546])比较器将它们连接起来以确定哪个数字会更大,它会问:

  

" 65546是大于还是小于54665"。

然后它继续对数组中所有其他数字组合执行此操作,以便在连接在一起时使它们排序成为最大数字。

答案 1 :(得分:0)

我写了some code that might help you understand

基本上,比较器可帮助您按最高有效数字进行排序,您可以使用我在df = pd.DataFrame({'student':['a'] * 4 + ['b'] * 6, 'semester':[1,1,2,2,1,1,2,2,2,2], 'passed_exam':[True, False] * 5}) print (df) passed_exam semester student 0 True 1 a 1 False 1 a 2 True 2 a 3 False 2 a 4 True 1 b 5 False 1 b 6 True 2 b 7 False 2 b 8 True 2 b 9 False 2 b table = df.groupby(["student","semester","passed_exam"]) .size() .unstack(fill_value=0) .rename_axis(None, axis=1) .reset_index() print (table) student semester False True 0 a 1 1 1 1 a 2 1 1 2 b 1 1 1 3 b 2 2 2 中提供的实现来避免字符串操作。我怀疑使用一些二进制数学可能有更有效的方法来做到这一点。

PowComp

代码输出这些结果。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var concatComp = new ConcatComp();
        var modComp = new ModComp();
        var powComp = new PowComp();

        var tests = new[]
            {
                Tuple.Create(0, 0),
                Tuple.Create(1, 9),
                Tuple.Create(9, 1),
                Tuple.Create(1, 999),
                Tuple.Create(999, 1),
                Tuple.Create(111, 9),
                Tuple.Create(9, 111),
                Tuple.Create(91, 19),
                Tuple.Create(19, 91)
            };

        foreach(var pair in tests)
        {
            var concatR = R(concatComp.Compare(pair.Item1, pair.Item2));
            var modR = R(modComp.Compare(pair.Item1, pair.Item2));
            var powR = R(powComp.Compare(pair.Item1, pair.Item2));
            Console.WriteLine(
       $"x:{pair.Item1}, y:{pair.Item2}, concatR:{concatR}, modR:{modR}, powR:{powR}");
        }
    }


    public static string R(int v)
    {
        if (v == 0)
            return "=";

        if (v < 0)
            return "y";

        return "x";
    }
}

public class ConcatComp : IComparer<int>
{
    public int Compare(int x, int y)
    {

        var xy = int.Parse(x.ToString() + y.ToString());
        var yx = int.Parse(y.ToString() + x.ToString());
        return xy - yx;
    }
}

public class ModComp : IComparer<int>
{
    public int Compare(int x, int y)
    {

        return (x % 10) - (y % 10);
    }
}

public class PowComp : IComparer<int>
{
    public int Compare(int x, int y)
    {

        return MSD(x) - MSD(y);
    }

    public int MSD(int v)
    {
        if (v < 10)
            return v;

        return v / (int)Math.Pow(10.0, (int)Math.Log10(v));
    }
}