我想在给定自定义映射的情况下对目录中的字符串数组进行排序(它实际上是基于其扇区的股票名称排序)。我不确定用于表示映射的数据结构,以及如何编写自定义排序方法。
例如,假设我有以下字符串数组:
string[] fileNames = "bac.csv", "c.csv", "cvx.csv", "java.csv", "msft.csv", "xom.csv";
以下是映射:
{"bac", "c"} => 0
{"msft", "java"} => 1
{"xom", "cvx"} => 2
我想string [] customSort(string [] fileNames)返回以下内容:
"bac.csv", "c.csv", "java.csv", "msft.csv", "xom.csv", "cvx.csv"
您将使用什么数据结构来表示映射,以及编写排序方法的优雅方式是什么?
答案 0 :(得分:7)
Array.Sort允许您指定键数组,因此您可以执行类似......
的操作int[] keys = new int[fileNames.Length];
Dictionary<string, int> mapping = new Dictionary<string, int>(StringComparer.CurrentCultureIngoreCase);
// set up our mappings like so
mapping.Add("bac", 0);
mapping.Add("c", 0);
mapping.Add("msft", 1);
mapping.Add("java", 1);
mapping.Add("xom", 2);
mapping.Add("cvx", 2);
// etc
for(int i=0; i < keys.Length; i++)
{
string token = System.IO.Path. GetFileNameWithoutExtension(fileNames[i]);
int mappingKey;
if(!mapping.TryGetValue(token, out mappingKey)) mappingKey = int.MaxValue;
keys[i] = mappingKey;
}
Array.Sort<int, string>(keys, fileNames);
只需修改keys[i] = -1;
语句,即可在给定token
变量的映射中获取正确的值。
答案 1 :(得分:1)
嗯......好像你的地图以可用的格式显示,你可以写一个自定义的IComparer实现并将其交给Array.Sort。也许我在你的问题中遗漏了一些重要的细节?