2016-12-15 3 views
1

Я получаю массив с сервера, и я храню его в NSMutableArray. Теперь проблема заключается в том, что массив не отсортирован. Напр. array = ["A", "B", "None", "C", "D"]. Я хочу отсортировать его и поместить элемент «Нет». i .e ["A", "B", "C", "D", "None"]. Пробовал смену, но не смог выполнить условие, так как массив может увеличиться в будущем. Проверьте мой код ниже, который не работает должным образом.Как добавить элемент в Последний индекс Swift

if array.containsObject("None"){ 
     print("\(array.indexOfObject("None"))") 
     let noneIndex = array.indexOfObject("None") 
     print(noneIndex) 
     array.removeObject(noneIndex) 
     print("Remove Array:-\(array)") 
     array.insertObject(noneIndex, atIndex: (array.lastObject?.index)!) 
     print("Sorted Array:-\(array)") 
    } 
+1

Есть ли причина, по которой вы не используете предоставленные методы 'sort()' или 'sorted()'? – Losiowaty

+0

Вам просто нужен array.addobject («None») – Amanpreet

+2

Почему 'NSMutableArray', а не массив Swift' [String] '? –

ответ

2

Может быть, я недоразумение, что это то, что вам нужно сделать, но вы можете использовать sorted() в массиве, если вы просто хотите, чтобы отсортировать их в алфавитном порядке.

Вы также можете использовать filter для удаления «Нет» из вашего массива, сортировать его, а затем добавить «None» в качестве последнего элемента

Например, если у вас есть

let elements = ["Alpha", "Bold", "None", "charlie", "Delta", "echo", "zebra", "k"] 

Вы могли бы начать с ее фильтрации:

let filteredElements = elements.filter { $0.uppercased() != "NONE"} 

Сортировка отфильтрованные элементы:

var sortedElements = filteredElements.sorted { $0.uppercased() < $1.uppercased()} 

Append "None"

sortedElements.append("None") // ["Alpha", "Bold", "charlie", "Delta", "echo", "k", "zebra", "None"] 

И сделать.

Здесь комбинируется:

let lastElement = "None" 
let elements = ["Alpha", "Bold", "None", "charlie", "Delta", "echo", "zebra", "k"] 
var sortedElements = elements.filter({$0.uppercased() != lastElement.uppercased()}).sorted(by: {$0.uppercased() < $1.uppercased()}) 
sortedElements.append(lastElement) 

Надежда, которая помогает вам.

+0

Его не просто алфавиты, это могут быть любые слова, , Условие «Нет» должно быть последним каждый раз. – iDeveloper

+0

@iDeveloper, в 'sorted' clos добавляет условие, которое делает' 'None '' всегда наибольшее значение. – user28434

+0

@pbodsk Это не работает, говорит он. Значение типа «Elememt» (Aka «AnyObject») не имеет члена «uppercased» – iDeveloper

1
var array = ["A", "B", "None", "C", "D"] 
if let noneIndex = array.index(of: "None") { 
    array.remove(at: noneIndex) 
    array.append("None") 
} 
print(array) 
+3

Обратите внимание, что вам не нужно проверять 'if array.contains()', если вы пишете 'if let noneIndex = array.indexOf (« None ») {' –

0

Это будет работать:

// starting test array 
let array = ["B", "None", "C","P","None","A", "Q"] 
var sorted = array.sorted { (str1, str2) -> Bool in 
    return str1 < str2 
} 

sorted.forEach { str in 
    if str == "None" { 
     if let idx = sorted.index(of: str) { 
      sorted.remove(at: idx) 
      sorted.append(str) 
     } 
    } 
} 

// Sorted array is now ["A", "B", "C", "P", "Q", "None", "None"] 
+0

Mutable Array не имеет ничего похожего на сортировку. error – iDeveloper

+1

Я бы предложил использовать массив Swift. Это будет лучше в долгосрочной перспективе. – JPetric

+0

Сортировка недоступна в переключателе 3. – iDeveloper

1

Это должно двигаться None в конце массива и отсортировать другие элементы:

let ["A", "B", "None", "C", "D"] 
array.sorted { $1 == "None" || $0 < $1 } // ["A", "B", "C", "D", "None"] 

Это просто берет преимущества by аргумент, который может быть перешел на метод sort/sorted от Array.

Редактировать @MartinR имел очень сильную точку относительно предиката сравнения из этого ответа, который действительно не предлагает strong weak ordering. Сортировка массива с правильным предикатом будет осуществляться по строкам:

array.sorted { $0 == "None" ? false : $1 == "None" ? true : $0 < $1 } 
+0

Кажется, что не работает для' ["A", "None", "Z"] ' –

+0

@MartinR благодарит за наблюдение, исправил код – Cristik

+0

Это может сработать, но теперь компаратор не является «строгим слабым порядком» по мере необходимости: '« None »<« None »' –

Смежные вопросы