Swift: номер группы присваивания члену кортежа в массиве кортежей - PullRequest
0 голосов
/ 10 июня 2019

У меня есть некоторый массив кортежей с таким определением:

[(description: [String], criterion: Int, relative: Double, average: Int, type: String, group: Int)] и отсортировано по убыванию .criterion.

Мне нужно добавить .group член к каждому Touple в этом массиве, основываясь на соответствующих значениях .criterion.

Значение .group равно 1...n, увеличиваясь на 1. Если несколько кортежей имеют одинаковое значение .criterion, то они будут иметь одинаковое значение .group.

Если у Tuple есть уникальное .criterion, то только у одного будет уникальное значение .group.

Я пытаюсь сделать это в коде ниже:

func appendingGroup(_ input: [(description: [String], criterion: Int, relative: Double, average: Int, type: String, group: Int)]) -> [(description: [String], criterion: Int, relative: Double, average: Int, type: String, group: Int)] {
var output: [(description: [String], criterion: Int, relative: Double, average: Int, type: String, group: Int)] = []
var index = 1
while index < input.count - 1 {
    if input[index].criterion != input[index + 1].criterion && input[index].criterion != input[index - 1].criterion {
        print(index)
        output[index].group = index
    }
    index += 1
}
return output}

Это основано на вопросе @Nicolai Henriksen Swift: цикл по элементам массива и доступ к предыдущим и следующим элементам

Но у меня [] в моем output.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Причина, по которой вы получаете пустой output, заключается в том, что вы не изменили его.

Попробуйте изменить

var output: [(description: [String], criterion: Int, relative: Double, average: Int, type: String, group: Int)] = []

до

var output = input

Полное

typealias Type = (description: [String], criterion: Int, relative: Double, average: Int, type: String, group: Int)

func appendingGroup(_ input: [Type]) -> [Type] {
    guard input.count > 2 else { return input } // without this check app will crash for arrays that are less than 2
    var output = input
    var index = 1

    while index < input.count - 1 {
        if input[index].criterion != input[index + 1].criterion && input[index].criterion != input[index - 1].criterion {
            output[index].group = index
        }

        index += 1
    }

    return output
}
0 голосов
/ 11 июня 2019

Окончательно работающее решение на основе комментария @Bohdan Savych:

    typealias Type = (description: [String], criterion: Int, relative: Double, average: Int, type: String, group: Int)

    func appendingGroup(_ input: [Type]) -> [Type] {
          guard input.count > 2 else { return input } // without this check app will crash for arrays that are less than 2
          var output = input
          var index = 0
          var group = 1
          while index < input.count - 1 {
                if input[index].criterion == input[index + 1].criterion {
                      output[index].group = group
                } else {
                      output[index].group = group
                      group += 1
                } 
                index += 1
          }
          if input[input.count - 1].criterion == input[input.count - 2].criterion {
                output[input.count - 1].group = output[input.count - 2].group
          } else {
                output[input.count - 1].group = (output[input.count - 2].group) + 1
          }
          return output
    }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...