对每个字符串的一部分(由字符分隔)上的字符串数组列表进行排序
本文关键字:字符串 数组 列表 排序 字符 一部分 分隔 | 更新日期: 2023-09-27 18:18:25
我正在尝试对 string
s 的ArrayList
进行排序(不是在 int
中(。
鉴于:F.E.
[0] 23,24
[1] 12,33
[2] 37,11
Arraylist.Sort
应该回馈(按最后一个数字升序排序(:
[0] 37,11
[1] 23,24
[2] 12,33
到目前为止有这个:
public class Point
{
public int i, j;
public Point(int i, int j)
{this.i = i; this.j = j;}
public string ToString()
{return i + "," + j;}
}
public class SList
{
public static void Main()
{
ArrayList Slist = new ArrayList();
Random Generate = new Random();
for (int i = 0; i < 3; i++)
{
Point p = new Point(Generate.Next(40), Generate.Next(40));
Slist.Add(p.ToString());
}
Slist.Sort();
}
}
我不是 100% 确定您是否有一个字符串数组或它们是否已经被拆分,但您可以创建一个自定义比较器并做这样的事情。更清楚地表达你想要什么,以便人们可以更好地帮助你。
public class MyCustomComparer : IComparer<string>
{
public int Compare(string x, string y)
{
var xIntValues = x.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
var yIntValues = y.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
for(var i = 0; i < Math.Min(xIntValues.Count(), yIntValues.Count()); ++i)
if (xIntValues[i] != yIntValues[i])
return xIntValues[i] - yIntValues[i];
return xIntValues.Count() - yIntValues.Count();
}
}
然后像这样使用它,其中数组元素包含字符串,例如"37, 11"
Array.Sort(myArray, MyCustomComparer);
在 c# 1.0 之后使用ArrayList
有点奇怪,但如果出于遗留原因有一个,您可以创建自己的非泛型自定义比较器,如下所示:
public class CustomComparer : IComparer<string>, IComparer {
#region IComparer<string> Members
int? ExtractNumber(string str)
{
int index = str.LastIndexOf(',');
if (index < 0)
return null;
var subStr = str.Substring(index+1);
int result;
if (int.TryParse(subStr, out result))
return result;
return null;
}
// Return x - y
public int Compare(string x, string y)
{
#if false
Given: f.e.
[0] 23,24
[1] 12,33
[2] 37,11
Arraylist.Sort should give back (sorted by the last number ascending):
[0] 37,11
[1] 23,24
[2] 12,33
#endif
var xVal = ExtractNumber(x);
var yVal = ExtractNumber(y);
if (!xVal.HasValue && !yVal.HasValue)
return x.CompareTo(y);
else if (!xVal.HasValue)
return 1;
else if (!yVal.HasValue)
return -1;
int cmp = xVal.Value.CompareTo(yVal.Value);
if (cmp != 0)
return cmp;
return x.CompareTo(y);
}
#endregion
#region IComparer Members
public int Compare(object x, object y)
{
if (object.ReferenceEquals(x, y))
return 0;
string xStr = x as string;
string yStr = y as string;
if (xStr == null && yStr == null)
return 0; // NO IDEA
else if (xStr == null)
return 1;
else if (yStr == null)
return -1;
else return Compare(xStr, yStr);
}
#endregion
}
以下代码在类上实现IComparable
。它按升序对y
进行排序:
public class Point : IComparable<Point>
{
public int x;
public int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public string ToString()
{
return x + "," + y;
}
public int CompareTo(Point other)
{
return this.y.CompareTo(other.y);
}
}
现在,您可以使用ArrayList.Sort()
来实现所需的订单。
最简单的方法是离开你的非泛型列表:
var sortedList = list.Cast<string>().OrderBy(x => x.Split(',')[1]);
该代码是不言自明的。
使用此作为输入:
var list = new ArrayList();
list.Add("23,24");
list.Add("12,33");
list.Add("37,11");
生成此输出:
37,11
23,24
12,33