Метод сортировки - это сортировка только добавленных строк, но не строк, которые были изначально в массиве. - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь получить кнопку, которая сохраняет то, что находится в текстовых полях, затем добавляет их в свои массивы, а затем сортирует массивы.Однако всякий раз, когда происходит сортировка, первые две строки в моем массиве не сортируются, а третья и все остальное сохраняется.

Вот массивы

//Array holding Names
var names: [String] =
  [

    "Alexander Jones",
    "Tony Stark",
    "cap"

  ]

//Array holding emails
var emails: [String] =
  [

    "alex@fiu.edu",
    "Tony@Stark.com",
    "cap@ca"

  ]

//Index to move through arrays
var index: Int = 0

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

@IBAction func updateButtonPressed(_ sender :UIButton)
  {

    var name = nameField.text
    let email = emailField.text

    print("0 \(names)")
    print("0 \(emails)")

    //if the email or name isn't modified
    //assume user is updating card
    if (name==names[index]) || (email==emails[index])
    {
        //if both textfileds are same as index, update since values will stay the same
        //if one filed is updated at the current index, it will be changed at the index and
        //still match the index of other array
        names[index]=name!
        emails[index]=email!

    }
    else
    {
        //if user puts a new value for both
        //we assume it is a new entry and add it to list
        names.append(name!)
        emails.append(email!)
        print("After Add")
        print("1 \(names)")
        print("1 \(emails)")

        //sort list in alphabetical after each update/save

        names = names.sorted(by: <)
        print("After sorted by name")
        print("2 \(names)")
        print("2 \(emails)")

        //find index new name is sorted too
        //and place new email in same index
        //of emailarray
        let newindex = names.index(of:name!)
        //emails.remove(at: index)
        emails.insert(email!, at: newindex!)
        print("After email insert")
        print("3 \(names)")
        print("3 \(emails)")
    }

  }

1 Ответ

0 голосов
/ 03 февраля 2019

Основная причина, по которой ваши имена не сортируются так, как вы ожидали, заключается в том, что при сортировке строк большие символы стоят на первом месте

B, a, c

, чтобы избежать такого поведения, вы можете использовать строчные буквы String, используя lowercased()


В любом случае, нет двух отдельных массивов.Есть только одна из ваших пользовательских моделей.Итак, сначала создайте свою собственную модель, используя struct

struct Person {
    var name, email: String
}

, а затем создайте массив людей

var people = [Person(name: "Alexander Jones", email: "alex@fiu.edu"),
              Person(name: "Tony Stark", email: "Tony@Stark.com"), 
              Person(name: "cap", email: "cap@ca")]

Затем, сразу после нажатия кнопки, добавьте новый Person и отсортируйте все элементы поих нижний регистр name

@IBAction func updateButtonPressed(_ sender: UIButton) {
    people.append(Person(name: nameField.text!, email: emailField.text!))
    people.sort { $0.name.lowercased() < $1.name.lowercased() }
}

Вы также можете добавить didSet наблюдатель к вашему массиву, и тогда ваш массив будет сортироваться каждый раз, когда будет добавлен какой-то новый элемент или массив будет каким-либо образом изменен

var people = [Person(name: "Alexander Jones", email: "alex@fiu.edu"),
              Person(name: "Tony Stark", email: "Tony@Stark.com"), 
              Person(name: "cap", email: "cap@ca")] {
    didSet {
        people.sort { $0.name.lowercased() < $1.name.lowercased() }
    }
}
...
@IBAction func updateButtonPressed(_ sender: UIButton) {
    people.append(Person(name: nameField.text!, email: emailField.text!))
}

И последнее, если вам нужно отсортировать массив перед первым нажатием кнопки, не забудьте отсортировать его, например, в viewDidLoad

контроллера
...