CircularQueue в Dart - PullRequest
0 голосов
/ 28 мая 2020

Есть ли в Dart какой-либо тип Iterable, элементы которого можно вращать, чтобы изменить их порядок? Что-то вроде Circular Queue?

Я пробовал использовать ListQueue из dart:collection, но не мог понять, как это должно было быть повернуто.

Пример:

print([1,2,3].rotateLeft()); // should print [2,3,1]

Любой метод расширения для любого указанного типа c тоже подойдет.

1 Ответ

1 голос
/ 28 мая 2020

Хорошо, тогда это очень просто logi c, которое вы можете реализовать самостоятельно. Посмотрите на следующий пример

void main() {
   List<int> numbers = [1,2,3];
   numbers = shiftingRight(numbers, 1);
   print(numbers);
   numbers = shiftingLeft(numbers, -1);
   print(numbers);

   //Without extra space
   rotateLeft(numbers, 2);
   print(numbers);

}

leftRotatebyOne(List<int> nums) {
  int first = nums[0];
  int i;
  for (i = 0; i < nums.length - 1; i++) 
    nums[i] = nums[i+1];

  nums[i] = first;
}


rotateLeft(List<int> nums, int offset) {

  for (int i = 0; i < offset; i++) {
    leftRotatebyOne(nums);
  }
}





List<int> shiftingRight(List<int> nums, int offset) {
    int length = nums.length;
    List<int> temp = List.from(nums);
    for (int i = 0; i < nums.length; i++) {
      temp[i] = nums[(i + offset) % length];
    }
    return temp;
  }

List<int> shiftingLeft(List<int> nums, int offset) {
  int length = nums.length;
  return shiftingRight(nums, length + offset);
}

Вывод

[2, 3, 1]
[1, 2, 3]
[3, 1, 2] //Without extra space

Да, вам нужен некоторый диапазон проверки массива, но идея очень проста

...