Проблема неопределенных массивов в визуализаторе сортировки слиянием в Angular - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь сделать визуализатор алгоритма сортировки, используя Angular. В настоящее время выполняется сортировка слиянием, и это доставляет мне проблемы. Я программист Java, поэтому я думаю, что я что-то делаю не так с машинописным текстом с рекурсивными вызовами. Когда я запускаю программу, она выдает ошибку, говоря, что «не могу прочитать длину свойства undefined». Я потерялся и не могу понять, где я ошибаюсь.

В моей первой функции я неоднократно разбивал исходный массив с именем visualArr, который является глобальным массивом в моей программе, размер которого определяется пользователем, и используется для визуализации алгоритмов сортировки. Затем вторая функция, которая у меня есть, используется для слияния разделенных массивов.

  performMergeSort(arr) {
    if (arr.length <= 1) {
      return arr;
    }

    const middle = Math.floor(arr.length / 2);

    let left = arr.slice(0, middle);
    let right = arr.slice(middle, arr.length);

    left = this.performMergeSort(left);
    right = this.performMergeSort(right);

    return this.performMerge(left, right);
  }

Функция таймера во втором блоке кода используется для визуальных эффектов сортировки. Однако я думаю, что что-то не так с моим logi c или что-то я делаю неправильно в TypeScript. Любые отзывы приветствуются.

performMerge(leftArr, rightArr) {
    let lIdx = 0;
    let rIdx = 0;
    let i = 0;

    timer(0, 100)
    .pipe(takeWhile(() => leftArr.length > lIdx && rightArr.length > rIdx))
    .subscribe(() => {
      const lItem = leftArr[lIdx];
      const rItem = rightArr[rIdx];

      if (lItem > rItem) {
        this.visualArr[i] = rItem;
        rIdx++;
      } else {
        this.visualArr[i] = lItem;
        lIdx++;
      }
      i++;
    });

    timer(0, 100)
    .pipe(takeWhile(() => leftArr.length > lIdx ))
    .subscribe(() => {
      this.visualArr[lIdx] = leftArr[lIdx++];
    });

    timer(0, 100)
    .pipe(takeWhile(() => rightArr.length > rIdx ))
    .subscribe(() => {
      this.visualArr[rIdx] = rightArr[rIdx++];
    });
  }

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

да, вы не можете прочитать длину свойства массива, если он не определен, т.е. он не инициализирован, поэтому попробуйте инициализировать все ваши массивы:

, если вы знаете тип: myArray:string[]=[]

если не просто так: myArray=[]

0 голосов
/ 09 мая 2020

Эта ошибка обычно возникает, когда вы неправильно инициализировали массив. Попробуйте это: -

visualArr:number[]=[];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...