从当前季节开始对一系列季节进行排序

Sort an array of seasons, starting with the current season

我有一个包含 4 个季节的数组:Summer, Autumn, Winter, Spring。我希望能够保持这种内在顺序,但将当前季节设为数组中的第一项。

因此,如果当前季节是 Winter,结果将是:Winter, Spring, Summer, Autumn

在我看来,这基本上涉及将数组视为 'loop',因此如果您将元素从开头移开,它就会出现在末尾,反之亦然。我对此有一些丑陋的实现,但我希望有一些漂亮干净的东西。

我正在用 Ruby 编写,但任何显示该算法的语言(或伪代码)都可以。

简单的解决方案是将元素保留在 circular linked list 中,并且每当季节发生变化时,将存储列表头部的指针向前移动。

这将相当优雅且易于使用,如果您只处理 4 个元素 - 链表的性能在这里真的不是问题。

使用mod 4访问数组。你的数组看起来像 [Summer, Autumn, Winter, Spring];创建一个函数 get(int index, int current) 获取索引 index 处的元素,假设当前季节是 current,其中夏季映射到 0,秋季映射到 1,等等

string get(int index, int current)
{  return array[ (current + index + 4) % 4 ];
}

这比循环列表解决方案更快、更简单。如果当前季节是冬季 (2),则 get(1, 2) 将 return 3,get(3, 2) 将 return 1。

经过一些研究,我发现 Ruby 的 Array 有 rotate 方法,这正是需要的:

base_order = ['Summer', 'Autumn', 'Winter', 'Spring']

sorted_order = base_order.rotate(base_order.index('Winter'))

# Yields ['Winter', 'Spring', 'Summer', 'Autumn']

有一个 banged 版本 #rotate! 也改变了基本数组。