Сравнение индексов в массиве Swift

У меня есть массив чисел, и я хочу проверить, равно ли число в index 1 числу в index 2, и если да, я хочу увеличить свой счетчик на 1. Я пробовал все, что мог, но не смог придумать правильный логика

это то, что я пробовал до сих пор

let c: [Int] = [0, 0, 0, 0, 1, 0]

for (index, val) in c.enumerated() {
        print(val)
        var counts = 0
        if c.firstIndex(of: index) == c.index(after: index) {
            print("yes")
            counts += 1
            print(counts)
        }
    }

поэтому, сравнивая 0 index 0 с 0 index 1, счетчик увеличивается на 1,
затем от 0 index 1 до 0 index 2 счетчик увеличивается на 1,
затем от 0 index 2 до 0 index 3 счетчик увеличивается на 1
затем от 0 index 3 до 1 index 4 пропустить,
затем от 0 index 3 до 0 index 5 счетчик увеличивается на 1

да. если это не так, вы переходите к этому значению и сравниваете его со следующим, равным предыдущему значению.

King 10.04.2019 16:58

я обновил вопрос

King 10.04.2019 17:03

значения могут быть только 0 и 1

King 10.04.2019 17:07

За всеми, кроме последнего 0 и последнего 1, следует одинаковое число, поэтому вы можете просто вернуть c.count - 2 (при условии, что в массиве есть и нули, и единицы, иначе это c.count - 1)

Martin R 10.04.2019 17:12

я не понимаю

King 10.04.2019 17:16

ответ на [0, 0, 1, 0, 0, 1, 0] 4 и ответ на 0 0 0 0 1 0 это 3

King 10.04.2019 17:20

Давайте продолжить обсуждение в чате.

Martin R 10.04.2019 17:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
734
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Пытаться

let c: [Int] = [0, 0, 0, 0, 1, 0]

var counter  = 0

var lastIndexOfZero = 0

for index in 1..<c.count {

    if c[lastIndexOfZero] == c[index] {
        counter += 1
    }

    if c[index] == 0 {
        lastIndexOfZero = index
    }
}

print(counter)

Или вы можете просто сделать

// in case your first number is 1
print(c.filter({ $0 == c[0] }).count-1)

Я обновил вопрос. он не возвращает правильный вывод

King 10.04.2019 17:06

@King It Does, я только что изменил форму вашего массива [0, 0, 0, 0, 1, 0] на [0, 0, 1, 1, 0, 1, 0]

Razi Tiwana 10.04.2019 17:08

@King Измени это на то, что ты хочешь

Razi Tiwana 10.04.2019 17:09

попробуйте [0, 0, 1, 0, 0, 1, 0]

King 10.04.2019 17:11

@King Это должно и возвращает 2, попробуйте.

Razi Tiwana 10.04.2019 17:12

2 неверно, он должен вернуть 4

King 10.04.2019 17:13

@King, пожалуйста, обновите вопрос в соответствии с вашим вопросом, он должен возвращать 2, поскольку только индекс 0 и индекс 1 совпадают, а индекс 3 и 4.

Razi Tiwana 10.04.2019 17:16

да, я обновил вопрос

King 10.04.2019 17:17

@King отредактировал ответ

Razi Tiwana 10.04.2019 17:28

Попробуй это :).

let numbers = [0, 0, 0, 0, 1, 0]

let count = numbers.enumerated().reduce(0) { result, tuple in
    let nextOffset = tuple.offset + 1

    guard
        nextOffset < numbers.count,
        numbers[nextOffset] == tuple.element
    else {
        return result
    }

    return result + 1
}

print(count)

Это вернет 3 для вашего массива.

если массив равен [0, 0, 1, 0, 0, 1, 0], он возвращает 2, что неверно

King 10.04.2019 17:10

Попробуйте с этим:

let c: [Int] = [0, 0, 0, 0, 1, 0]

let numberOfCycles = c.count-2

var count = 0
for i in 0...numberOfCycles {
    if c[i] == c[i+1] {
        count += 1
    }
}

print(count)

это та же проблема, если массив [0, 0, 1, 0, 0, 1, 0], он возвращает 2, что неверно, и должно быть 4

King 10.04.2019 17:22

Почему должно быть 4? Найдены индексы 0 и 3, какие другие индексы должны увеличить счетчик?

LorenzOliveto 10.04.2019 17:23

поскольку индекс 2 равен 3, вы сравниваете индекс 1 с индексом 4.

King 10.04.2019 17:25

Я не понимаю, о чем вы спрашиваете, извините, индекс 2 = 1, и я не сравниваю индекс 1 с индексом 4. Я думаю, вам следует переформулировать то, чего вы пытаетесь достичь.

LorenzOliveto 10.04.2019 17:27
Ответ принят как подходящий

Проблема под рукой

Конкретная проблема в вашем случае заключается в том, что c.firstIndex(of: index) находит первый индекс index в c. Я думаю, вы хотели написать c.firstIndex(of: val), но даже это не сработает. Например, если вы спросите c.firstIndex(of 0), он всегда даст вам 0, даже если вы находитесь на полпути через массив, потому что в вашем тестовом примере первый элемент 0 всегда имеет индекс 0.

Другая проблема заключается в том, что ваш count находится в области цикла, что означает, что каждая итерация получает свою собственную независимую переменную count, инициализированную до 0, которая в лучшем случае будет увеличена до 1 перед повторной инициализацией.

Более чистое решение

Это идеальный случай для более функционального стиля. Это намного проще, но тоже довольно элементно.

Решение представляет собой цепочку из 4 шагов:

  1. Используйте шаблон zip(a, a.dropFirst()), который для массива a, состоящего из [1, 2, 3, 4, 5], создаст массив пар смежных элементов, например [(1, 2), (2, 3), (3, 4), (4, 5)]

  2. Оттуда нужно проверить каждую из пар, чтобы увидеть, совпадают ли их два элемента. Если это так, мы меняем их на 0, иначе на 1.

  3. Затем мы просто суммируем эти числа, чтобы получить окончательный результат.

  4. В идеале мы упаковываем этот код в функцию и делаем его универсальным, чтобы его можно было легко использовать повторно.

Таким образом мы получаем:

extension Sequence where Element: Equatable {
    func countOfAjacentDifferingElements() -> Int {
        return zip(self, self.dropFirst())
            .lazy
            .map { $0 == $1 ? 1 : 0 }
            .reduce(0, +)
    }
}

let numbers = [0, 0, 0, 0, 1, 0]
print(numbers.countOfAjacentDifferingElements()) // => 2

но [0 0 1 0 0 1 0] дает 2 вместо 4

King 10.04.2019 17:38

Хм, я не понимаю, почему он должен давать 4. Здесь всего 2 пары соседних одинаковых элементов, показанных здесь со скобками: [(0 0) 1 (0 0) 1 0]

Alexander 10.04.2019 17:40

[a,b,c,d,e,f,g], от a до b, от b до d, от d до e, от e до g]

King 10.04.2019 17:43

О, так ты считаешь пары разных элементов? В этом случае вы можете просто поменять местами 0 и 1, чтобы счетчик увеличивался, когда == возвращает false: $0 == $1 ? 0 : 1

Alexander 10.04.2019 17:50

Другие вопросы по теме