Записывать повторяющиеся значения в массив 2d - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь оптимизировать расписание всей школы.У меня есть расписание в настоящее время организовано в листе.Инициалы учителя - это заголовки для каждого столбца, и каждая строка соответствует одному учебному периоду в течение 30 уроков.Каждая ячейка содержит имя класса.

В настоящее время я ищу классы, которые разделены между двумя учителями.

Я пытаюсь создать приложение, которое будет регистрировать имя класса, если оно появится где-либоза пределами текущего столбца (т. е. один и тот же класс преподают 2 или более разных преподавателя в разное время)

Я знаю, что циклы вложения - не наименее эффективный способ сделать это, но я просто хотел взломатьчто-то вместе быстро, чтобы сделать работу.К сожалению, этот код занимает больше времени, чем максимально допустимое время.Массив состоит всего из 30 строк и около 56 столбцов, поэтому я не понимаю, почему он занимает так много времени.(Не могу увидеть ничего, что, очевидно, бесконечно в моих циклах)

Кто-нибудь может помочь?:)

function splitClassLocator() 
{
  //copy the sheet to a 2d array.
  //(1)descend through each column from vertical idx 3 to period6 idx36
    //(2)start at horiz idx 1, descend through each item vertically. 
      //if item from loop 1 matches item from loop 2 and loop 1 vertical index != loop 2 vertical index
         //log the item (split class)

  //GET THE DATA     
  var sh0 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var range = sh0.getDataRange();
  var data = range.getValues();

  //COMPARE
  //main row mr, main col mc V compare row cr, compare col cc
  Logger.log("Rows = " + data.length + "cols = " + data[0].length);

  for (var mr = 2; mr < data.length; mr ++)
  {
    for (var mc = 1; mc < data[0].length; mc ++)
    {
      for (var cr = 2; cr < data.length; cr ++)
      {
        for (var cc = 1; cc, data[0].length; cc ++)
        {
          if (mc != cc) // if it's not comparing classes belonging to the same teacher
          {
            if ((data[mr][mc] != undefined) || (data[mr][mc] != null) || (data[mr][mc] != ""))
            {
              if (data[mr][mc] == data[cr][cc])
              {
                Logger.log(data[mr][mc]);
              }
            }
          }
        }
      }
    }
  }


}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вместо того, чтобы отбрасывать информацию после сравнения, сохраните ее и используйте!Добро пожаловать в мир non-Arrays!

Ваша заявленная цель - найти классы, в которых обучаются более двух учителей.Таким образом, минимум, который вам нужно сделать, это подсчитать эту информацию за один проход по массиву.

function countTeachersPerClass() {
  const schedule = SpreadsheetApp.getActive().getSheetByName("somename").getDataRange().getValues();
  const headers = schedule.shift();
  const numTeachers = headers.length;
  // Store classes as properties in an Object.
  const classes = {};

  // Read the schedule array.
  // Assumption: time is in index 0, classes in all other.
  schedule.forEach(function (period) {
    var name = period[0];
    // Store each class in this period.
    for (var teacherIndex = 1; teacherIndex < numTeachers; ++teacherIndex) {
      // Have we seen this class? If no, initialize it.
      var classID = period[teacherIndex];
      if (!classes[classID])
        classes[classID] = {teachers: {} };
      // Add this teacher to its list of teachers.
      var tID = headers[teacherIndex];
      if (!classes[classID].teachers[tID])
        classes[classID].teachers[tID] = {periods: []};

      // Add this period for this teacher.
      classes[classID].teachers[tID].periods.push(name);
    } //End for loop over columns in a row.
  }); // End forEach over schedule's rows.

  // Log the object (in Stackdriver, for easy review and interactivity).
  console.log({message: "Built classes  object", input: schedule, result: classes, teachers: headers});

  // Make a report from it.
  const report = [["Class ID", /* other headers */]];
  for (var cID in classes) {
    // This particular report is for class with more than two teachers.
    if (Object.keys(classes[cID].teachers).length > 2) {
      var row = [cID];
      /** Push info to the row, perhaps with just the names
         of the teachers, or also including number of
         periods per each teacher, etc. */;
      // Add the completed report row to the report.
      report.push(row);
    }
  }

  // Log the report.
  console.info({message: "Report", report: report});
}

Вы, конечно, могли бы стать более изящными, добавив больше свойств к каждому объекту классов, чем просто teachers, например, отслеживая среднее время обучения (например, какие классы часто сменяют преподавателей), но я оставляю это какупражнение для читателя:)

0 голосов
/ 30 мая 2018

Это работает немного лучше, сглаживая, чтобы сделать 2 одномерных массива, один - учитель для проверки, а другой массив - все остальные расписания вместе взятые.*

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