arrays - তারিখ অনুসারে অ্যারেগুলিকে বাছাই করুন




swift sorting (3)

আপনার কাছে একটি অ্যারের historyArray রয়েছে যা HistoryObject একটি অ্যারে ধারণ করে। প্রতিটি HistoryObject "এমএম ডিডি, ইয়াই" ফর্মটিতে একটি তারিখের স্ট্রিং থাকে

সম্পাদনা:

(আপনি নিজের ইতিহাসের বস্তুগুলিকে তাদের তারিখের মান অনুসারে বাছাই করতে চান those তারিখের স্ট্রিংগুলির সাথে তারিখের স্ট্রিংগুলির সাথে অবজেক্টগুলিকে সাজানোর চেষ্টা করা একটি খারাপ ধারণা, যেহেতু আপনাকে প্রতিটি তারিখের সাথে তারিখের স্ট্রিংগুলি কোকো Date সামগ্রীতে রূপান্তর করতে হবে, সুতরাং আপনি শেষ করুন তারিখগুলিকে বারবার এবং তারিখগুলিতে রূপান্তরিত করা। আমি একটি বেঞ্চমার্কে, এর ফলে বাছাইয়ের আগে আপনার তারিখের স্ট্রিংগুলিকে বাছাইয়ের আগে Date অবজেক্টগুলিতে ব্যাচ-রূপান্তরকরণের চেয়ে 1200 এক্স ধীরে ধীরে চালানো হয়))

দক্ষতার সাথে এটি করার জন্য আপনাকে প্রথমে সমস্ত বস্তুর জন্য Date মানগুলি অর্জন করতে হবে। এটি করার একটি উপায় হ'ল তারিখের স্ট্রিং থেকে গণনা করা আপনার HistoryObject একটি অলস Date যোগ করা। আপনি যদি এটি না করতে চান তবে আপনি:

  1. একটি ডেটফরম্যাটর ব্যবহার করে আপনার ইতিহাসের বস্তুর অ্যারে মানচিত্রের তারিখের অবজেক্টগুলিতে ম্যাপ করুন।
  2. ইতিহাসের বস্তুর অ্যারে এবং তারিখের বস্তুর অ্যারে টিপলসের অ্যারেতে একত্রিত করতে zip() ফাংশনটি ব্যবহার করুন।
  3. টিপলসের অ্যারে বাছাই করুন।
  4. ইতিহাসের সামগ্রীর অ্যারেতে টিপলসের অ্যারেটি মানচিত্র করুন।

এটি করার কোডটি এই জাতীয় কিছু দেখতে পারে:

সংস্করণ 1

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM dd, yyyy"

//I don't know what your HistoryObject looks like, so I'll fake it.
struct HistoryObject: CustomStringConvertible {
    let dateString: String
    let value: Int

    var description: String {
        return "date: \(dateString), value: \(value)"
    }
}

//Create an array of date strings.
let testArray = ["Jun 25, 2016", "Jun 30, 2016", "Jun 28, 2016", "Jul 2, 2016"]

//Use the array of date strings to create an array of type [HistoryObject]
let historyArray: [HistoryObject] = testArray.map {
    let value = Int(arc4random_uniform(1000))
    return HistoryObject(dateString: $0, value: value)
}

print("\n-----> Before sorting <-----")
historyArray.forEach { print($0) }

//Create an array of the `Dates` for each HistoryObject
let historyDates: [Date] = historyArray.map { dateFormatter.date(from: $0.dateString)!
}

//Combine the array of `Dates` and the array of `HistoryObjects` into an array of tuples
let historyTuples = zip(historyArray, historyDates)

//Sort the array of tuples and then map back to an array of type [HistoryObject]
let sortedHistoryObjects = historyTuples.sorted { $0.1 > $1.1}
    .map {$0.0}

print("\n-----> After sorting <-----")
sortedHistoryObjects.forEach { print($0) }

আপনি যদি নিজের ইতিহাসে একটি lazy var date বর্ণের lazy var date করেন তবে বাছাইকরণ কোডটি খুব সহজ:

সংস্করণ 2:

//I don't know what your HistoryObject looks like, so I'll fake it.
class HistoryObject: CustomStringConvertible {
    let dateString: String
    lazy var date: Date = { dateFormatter.date(from: self.dateString)! }()
    let value: Int

    var description: String {
        return "date: \(dateString), value: \(value)"
    }

    init(dateString: String, value: Int) {
        self.dateString = dateString
        self.value = value
    }
}

//Create an array of date strings.
let testArray = ["Jun 25, 2016", "Jun 30, 2016", "Jun 28, 2016", "Jul 2, 2016"]

//Use the array of date strings to create an array of type [HistoryObject]
let historyArray: [HistoryObject] = testArray.map {
    let value = Int(arc4random_uniform(1000))
    return HistoryObject(dateString: $0, value: value)
}

print("\n-----> Before sorting <-----")
historyArray.forEach { print($0) }

let sortedHistoryArray = historyArray.sorted { $0.date > $1.date }
print("\n-----> After sorting <-----")
sortedHistoryArray.forEach { print($0) }

আমার কাছে অ্যারে রয়েছে HistoryObject নামে একটি বস্তু রয়েছে এবং এটিতে "তারিখ", "নাম" ইত্যাদির মতো বৈশিষ্ট্য রয়েছে has

আমি অ্যারে বাছাই করছি এভাবে:

 let sortedArray = HistoryArray.sort({ $0.date.compare($1.date) == NSComparisonResult.OrderedDescending})

যা নতুন থেকে পুরানো পর্যন্ত তারিখটি সাজানোর কথা রয়েছে। উদাহরণ স্বরূপ:

  • 30 শে জুন, 2016
  • জুন 29, 2016

ইত্যাদি ..

তবে যখন আমার অ্যারেতে "জুলাই 2, ২০১" "রয়েছে বাছাই করা অ্যারেটি হয়ে যায়:

  • 30 শে জুন, 2016
  • জুন 29, 2016
  • জুলাই 2, 2016

"জুলাই 2, 2016" বাছাইয়ের পরে শীর্ষে থাকা উচিত, এখন এটি নীচে? আমি কিভাবে এই সমস্যা ঠিক করতে পারবো?


রূপান্তরিত অ্যারে অতিরিক্ত পরিবর্তনশীল এড়ানো

সুইফট 4 এবং সুইফট 3 ব্যবহার করা

let testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"]

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd"

var ready = convertedArray.sorted(by: { dateFormatter.date(from:$0).compare(dateFormatter.date(from:$1)) == .orderedDescending })

print(ready)

সুইফট 4 এবং সুইফট 3 ব্যবহার করা

let testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"]
var convertedArray: [Date] = []

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd"

for dat in testArray {
    let date = dateFormatter.date(from: dat)
    if let date = date {
        convertedArray.append(date)
    }
}

var ready = convertedArray.sorted(by: { $0.compare($1) == .orderedDescending })

print(ready)

সুইফট 2 ব্যবহার করা

উদাহরণস্বরূপ আপনার কাছে তারিখের সাথে অ্যারে এবং আরও একটি অ্যারে রয়েছে, যেখানে আপনি রূপান্তরিত তারিখগুলি সংরক্ষণ করবেন:

var testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"]
var convertedArray: [NSDate] = []

এর পরে আমরা তারিখগুলি রূপান্তর করি:

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd"

for dat in testArray {
    var date = dateFormatter.dateFromString(dat)
    convertedArray.append(date!)
}

এবং ফলাফল:

var ready = convertedArray.sort({ $0.compare($1) == .OrderedDescending })

print(ready)




sorting