Swift - Найти максимальное значение в массиве пользовательских классов с несколькими переменными - PullRequest
0 голосов
/ 04 ноября 2018

Я бы хотел найти самое высокое значение в моем массиве. Я нашел метод .max () в документации Apple.

let heights = [67.5, 65.7, 64.3, 61.1, 58.5, 60.3, 64.9]
let greatestHeight = heights.max()
print(greatestHeight)
// Prints "Optional(67.5)"

Мой массив имеет пользовательский тип данных. Тип данных содержит две переменные типа integer. Как найти наибольшее значение из одной из переменных?

Это мой класс.

class Example: Codable {

// Variables
var value1: Int
var value2: Int

// Init
init(_value1: Int, _value2: Int) {
    value1 = _value1
    value2 = _value2
}    

}

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Вы можете сделать это, следуя протоколу Comparable и внедрив func < (в этом случае я сравниваю сумму двух значений)

struct Example: Codable, Comparable {
    static func < (lhs: Example, rhs: Example) -> Bool {
        return lhs.sum < rhs.sum
    }

    // Variables
    var value1: Int
    var value2: Int

    // Init
    init(_value1: Int, _value2: Int) {
        value1 = _value1
        value2 = _value2
    }

    var sum: Int {
        return value1 + value2
    }
}


let array = [Example(_value1: 1, _value2: 4), Example(_value1: 2, _value2: 3)]

print(array.max())

//Example(_value1: 1, _value2: 4)
0 голосов
/ 04 ноября 2018

Как вы пояснили в комментарии:

Я хочу узнать максимальное значение value1 из всех объектов в этом массиве

Это может быть достигнуто путем сопоставления каждого объекта его value1, а затем определения максимум:

let maxValue1 = examples.map { $0.value1 }.max()

Если данный массив действительно огромен, тогда может быть полезно используйте «ленивый вариант», чтобы избежать создания промежуточного массива:

let maxValue1 = examples.lazy.map { $0.value1 }.max()
0 голосов
/ 04 ноября 2018

Ну, экземпляр Class не является Array, поэтому вы не можете получить доступ к Array functions, однако вы можете использовать пользовательский func внутри, чтобы получить большее значение.

что-то вроде этого вариант.

class Example: Codable {

// Variables
var value1: Int
var value2: Int

// Init
init(_value1: Int, _value2: Int) {
    value1 = _value1
    value2 = _value2
}
        func max() -> Int {
        if value1 > value2 {
            return value1
        }
        return value2
    }
}

 // USAGE
var example = Example(_value1: 10, _value2: 20)

example.max()

ОБНОВЛЕНИЕ: как указал ОП, ему нужно сравнить только первое значение. отредактируйте ответ @Ashley, это решит проблему

при .max() вернет object, содержащее самое высокое Value1.

struct Example: Codable, Comparable {
    static func < (lhs: Example, rhs: Example) -> Bool {
        return lhs.value1 < rhs.value1
    }

    // Variables
    var value1: Int
    var value2: Int

    // Init
    init(_ value1: Int, _ value2: Int) {
        self.value1 = value1
        self.value2 = value2
    }
}


let array2 = [Example(1, 4), Example(2,3)]

print(array2.max()?.value1)
...