我已经做了一些广泛的搜索,所以如果这是重复请宰我:D
我有一个字节数组列表(List),其中数组的长度各不相同。我需要按数组长度按升序排序列表,然后按数组中的字节排序(请参阅示例)。
示例:
我想从:
{0,1,2}
{0,4}
{0,3,2}
{0,1,3}
{0,2,4,6,1}
{0,1,1}
{0,3,4,5}
为:
{0,4}
{0,1,1}
{0,1,2}
{0,1,3}
{0,3,2}
{0,3,4,5}
{0,2,4,6,1}
它基本上是字母顺序,但是有一组数字而不是字符(可以说是同一个东西),任何想法?
答案 0 :(得分:8)
您唯一需要做的就是实现IComparer<T>
接口并将其提供给排序算法。在这种情况下,算法看起来像:
public ByteArrayComparer : IComparer<byte[]> {
public int Compare (byte[] ba, byte[] bb) {
int n = ba.Length; //fetch the length of the first array
int ci = n.CompareTo(bb.Length); //compare to the second
if(ci != 0) { //if not equal return the compare result
return ci;
} else { //else elementwise comparer
for(int i = 0; i < n; i++) {
if(ba[i] != bb[i]) { //if not equal element, return compare result
return ba[i].CompareTo(bb[i]);
}
}
return 0; //if all equal, return 0
}
}
}
接下来,您可以使用List<T>.Sort
方法:
List<byte[]> data = new List<byte[]>();
//add arrays to data
data.Sort(new ByteArrayComparer());
//data is now sorted
排序算法要求比较器有效,如果比较器满足排序关系的三个约束,则比较器有效:
0
; 0
的内容),则 y 大于 x (大于0
的东西); 如果比较器不满足该关系,则排序算法将无法正确排序,因为您的订单没有意义。
答案 1 :(得分:1)
为什么不简单地使用LINQ
MyList = MyList.OrderBy(arr=>arr.Length).ThenBy(arr =>arr.Sum()).ToList();
一个工作示例:
List<int[]> a = new List<int[]>();
int[] t1 = { 0, 4 };
int[] t2 = { 0, 1, 2 };
int[] t3 = { 0, 1, 3 };
int[] t4 = { 0, 2, 4, 6, 1 };
int[] t5 = { 0, 1, 1 };
int[] t6 = { 0, 3, 4, 5 };
a.Add(t1);
a.Add(t2);
a.Add(t3);
a.Add(t4);
a.Add(t5);
a.Add(t6);
a = a.OrderBy(arr=>arr.Length).ThenBy(arr =>arr.Sum()).ToList();
foreach (int[] item in a)
{
foreach (int item2 in item)
{
Console.Write(" "+item2);
}
Console.WriteLine();
}
示例输出:
0 4
0 1
0 1 2
0 1 3
0 3 4 5
0 2 4 6 1
正如所指出的那样,在{3 4 5},{4 5 3}
等情况下,这可能会失败