使用字符串表示法的SortedList,但按数字排序

如何解决使用字符串表示法的SortedList,但按数字排序

我注意到键int的排序列表对值进行数字排序

SortedList < int,double> sl0 = new SortedList<int,double>();
for(int i = 0; i < 20; i++)
  sl0.Add(i,0.01);

[0,0.01]
[1,0.01]
[2,0.01]
[3,0.01]
[4,0.01]
[5,0.01]
[6,0.01]
[7,0.01]
[8,0.01]
[9,0.01]
[10,0.01]
[11,0.01]
[12,0.01]
[13,0.01]
[14,0.01]
[15,0.01]
[16,0.01]
[17,0.01]
[18,0.01]
[19,0.01]

和键字符串的排序列表按字母顺序对值进行排序

SortedList < string,double> sl1 = new SortedList<string,double>();
for(int i = 0; i < 20; i++)
  sl1.Add(i.ToString(),0.01]

有什么办法可以使嵌套键按数字进行排序,例如,键的顺序必须像这样。首先,我想像我可以使用这样的字符串,但是可以确定它们是按字母顺序排序的:

//Keys
//"0;0"
//"0;0;0"
//"0;1"
//"0;2"
//"0;10"
//"0;10;1;0;0"
//"1;0"
//"2;1"
//"3;1"
//"3;1;2"

现在我有一个继承排序列表的类:

public class Plates : Comparer<int[]>,IEnumerable<keyvaluePair<string,Plate>>{


    //Store all plates as a sorted list
    //String is use for storing groups
    //i.e. 0,1,2 ... fn
    //i.e. 0;0,0;1,0;2,1;3,1;4,1;5 ... gn_fn
    private SortedList<string,Plate> sortedplates;



    public Plates() {
        sortedplates = new SortedList<string,Plate>();
    }

    #region IEnumerable Implementation
    public void Add(Plate item) => sortedplates.Add(item.fID,item);
    public IEnumerator<keyvaluePair<string,Plate>> GetEnumerator() =>  sortedplates.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    #endregion

    #region IComparer


    public override int Compare(int[] x,int[] y) {

        int[] a = x.Length < y.Length ? x : y;
        int[] b = x.Length < y.Length ? y : x;

        for(int i = 0; i < a.Length; i++) {
            if (a[i] != b[i])
                return a[i].Compareto(b[i]);
        }

        return 0;

    }
    #endregion

解决方法

自定义比较器:

class KeyComparer : IComparer<string>
{
    public int Compare(string x,string y)
    {
        var xs = x.Split(';');
        var ys = y.Split(';');

        int min = Math.Min(xs.Length,ys.Length);

        for (int i = 0; i < min; i++)
        {
            int cmp = xs[i].CompareTo(ys[i]);

            if (cmp != 0)
                return cmp;
        }

        return xs.Length.CompareTo(ys.Length);
    }
}

使用:

var list = new SortedList<string,double>(new KeyComparer());

list.Add("0;1",0);
list.Add("0;0;0",0);
list.Add("0;10;1;0;0",0);
list.Add("0;2",0);
list.Add("0;10",0);
list.Add("1;0",0);
list.Add("3;1;2",0);
list.Add("2;1",0);
list.Add("3;1",0);
list.Add("0;0",0);

foreach (var x in list)
    Console.WriteLine(x);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?