c#按字母顺序获取下一个字符串
本文关键字:获取 下一个 字符串 顺序 | 更新日期: 2023-09-27 18:26:30
我有一个包含字符串的数组。我想将我的当前字符串与数组中的所有字符串进行比较,然后得到下一个按字母顺序排列的字符串。我该怎么做?
澄清:字符串没有任何顺序。我想知道哪个索引有下一个字符串,哪个字符串的字母顺序是下一个。例如,如果我有字符串"Bananas",那么我想要从"Apple"Oranges"Banana"中得到的下一个字符串将是"Orange"。
给定阵列
var fruit = new[] { "Apple", "Oranges", "Bananas" }
我想要一个能通过测试的函数
Assert.AreEqual(1, NextGreatestIndex(fruit, 2))
因为CCD_ 1在CCD_。
- 将数组按所需的字母顺序排序
- 在该排序数组中查找当前字符串的索引
- 返回带有下一个索引的字符串
- 处理当前字符串不在数组中或当前字符串是数组的最后一个元素的边缘情况
字符串没有任何顺序。我想知道哪个索引有具有下一个字母顺序的下一个字符串。例如,如果有一串"香蕉"——我想要的下一串"苹果"橙子"香蕉"将是"橙子"
使用LINQ很简单:
string[] fruits = {"Apple", "Oranges", "Bananas"};
string fruit = "Bananas";
string next = fruits.OrderBy(s => s).FirstOrDefault(f => string.Compare(f, fruit) > 0);
如果next
后面没有果实,则为null
。
也许您希望为将来的查找保留一个已排序的集合,以避免一直重新排序。
你可以使用SortedSet<string>
和它的GetViewBetween
方法:
var sortedFruits = new SortedSet<string>(fruits);
next = sortedFruits.GetViewBetween(fruit, sortedFruits.Max).Skip(1).FirstOrDefault();
请注意,即使您添加了新项目,该集合也会保持其顺序。它还跳过重复项,但在这种情况下这应该不是问题,因为您只想按字母顺序获得下一个项目。
你能做的最简单的事情是:
var strings = new[]{"apples","oranges","bananas"};
var sample = "apples";
var next = strings.OrderBy(i=>i).SkipWhile(i=>!i.Equals(sample)).Skip(1).Take(1).SingleOrDefault();
最具性能的方法是使用BinarySearch,这样操作将为O(log(N))(您需要存储排序列表以备重复使用)。
var sorted = strings.OrderBy(i=>i).ToList();
var sample = "bananas";
var index = sorted.BinarySearch(sample);
var next = index < 0 ? null : index >= sorted.Count - 1 ? null : sorted[index + 1];
EDIT现在反映了澄清的问题。
适用于任何IList<T>
(包括字符串数组)的通用实现。
int NextGreaterIndex<T>(
IList<T> list,
int currentIndex,
Comparer<T> comparer = null)
{
if (comparer == null)
{
comparer = Comparer<T>.Default;
}
var result = -1;
var best = default(T);
var found = false;
var current = list[currentIndex];
for (var i = 0; i < list.Count; i++)
{
if (i == currentIndex)
{
continue;
}
var t = list[i];
if (comparer.Compare(current, t) >= 0)
{
continue;
}
if (found && comparer.Compare(t, best) >= 0)
{
continue;
}
best = t;
result = i;
found = true;
}
return result;
}
用法:
var fruit = new[] { "Apple", "Oranges", "Bananas" }
var answer = NextGreaterIndex(fruit, 2);
// answer == 1