কীভাবে সুইফট ভাষায় দুটি স্ট্রিং উপেক্ষা করে তুলনা করবেন?


97

আমরা কীভাবে দ্রুত অগ্রাহ্যকরণের ক্ষেত্রে দুটি স্ট্রিং তুলনা করতে পারি? যেমন:

var a = "Cash"
var b = "cash"

যদি আমরা var a & var b এর তুলনা করি তবে এমন কোনও পদ্ধতি কি সত্য ফিরে আসবে?


4
তুলনা করার আগে আপনি উভয়কে লোয়ার কেসে রূপান্তর করতে পারেন।
দিনো টু

9
কেবলমাত্র উল্লেখ্য যে lowercaseStringকয়েকটি উত্তরে এটি উল্লেখ করা হয়েছে কিছু ভাষায় ব্যর্থ হবে (উদাহরণস্বরূপ স্ট্রাই! = স্ট্র্যাসে)
অ্যালাদিনিয়ান

@ অ্যালাডিনিয়ান আপনি কীভাবে এটি করার পরামর্শ দিচ্ছেন। এই সমস্যাটি সমাধানের বেশিরভাগ উদাহরণগুলি সমস্ত আপার কেস বা সমস্ত নিম্নতর ক্ষেত্রে রূপান্তরিত করে?
স্টিভ

4
@Steve অ্যাপল প্রস্তাব দেওয়া caseInsensitiveCompare:& localizedCaseInsensitiveCompare:পরিবর্তে
Alladinian

4
@ স্টিভ সিউর! (আপনি চেষ্টা করতে পারেন "Straße".localizedCaseInsensitiveCompare("STRASSE")- আমদানির কথা মনে রাখবেন Foundation)
অ্যালাদিনিয়ান

উত্তর:


14

এটা চেষ্টা কর:

var a = "Cash"
var b = "cash"
let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil)

// You can also ignore last two parameters(thanks 0x7fffffff)
//let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch)

ফলাফলটি এনএসসি তুলনা ফলাফল এনাম:

enum NSComparisonResult : Int {

    case OrderedAscending
    case OrderedSame
    case OrderedDescending
}

সুতরাং আপনি যদি বিবৃতি ব্যবহার করতে পারেন:

if result == .OrderedSame {
    println("equal")
} else {
    println("not equal")
}

আমি যদি সঠিকভাবে স্মরণ করি তবে ব্যাপ্তি এবং স্থানীয় প্যারামিটারগুলি alচ্ছিক এবং পুরোপুরি বাদ দেওয়া যেতে পারে।
মিক ম্যাককালাম

4
হ্যাঁ, আমি সমস্ত পরামিতিগুলির সাথে পুরো পদ্ধতিটি প্রদর্শন করতে চেয়েছিলাম।
গ্রেগ

আপনার এখানে সঠিক উত্তর থাকা উচিত। স্ট্রিংগুলির তুলনা করা কেবলমাত্র সেগুলি সমান কিনা তা জানার বিষয়ে নয়
মিকায়েল

184

এটা চেষ্টা কর :

পুরানো দ্রুত জন্য:

var a : String = "Cash"
var b : String = "cash"

if(a.caseInsensitiveCompare(b) == NSComparisonResult.OrderedSame){
    println("voila")
}

সুইফ্ট 3+

var a : String = "Cash"
var b : String = "cash"

if(a.caseInsensitiveCompare(b) == .orderedSame){
    print("voila")
}

13
সুইফ্ট 3 এ আপনাকে ব্যবহার করা দরকারa.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
অজিদকোভ

4
দ্রষ্টব্য: caseInsensitiveCompare(_:)সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত নয়, বরং এটি Foundationকাঠামোর অংশ , সুতরাং এটি প্রয়োজন import Foundation
ক্রিসমাসে

এটির চেয়ে ভাল হওয়ার কোনও কারণ আছে কি a.lowercased() == b.lowercased()?
jowie

অন্যান্য মন্তব্যগুলিতে যেমন উল্লেখ করেছেন @ জুই, নিম্ন / বড়হীন () ব্যবহার করে কিছু ভাষায় ব্যর্থ হতে পারে।
কুমানজোর

36

ব্যবহার caseInsensitiveCompare পদ্ধতি:

let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"

তুলনামূলক ফলাফল আপনাকে বলবে যে শব্দটি অভিধানের অর্থে অন্যটির চেয়ে আগে আসে (অর্থাত্ শব্দটি কোনও অভিধানের সামনের দিকে আসে)। .orderedSameমানে স্ট্রিং অভিধানে একই স্পটে শেষ হবে


কি .orderedSameমানে? ডক্স শুধু বলতে দুই operands সমান । তবে কেন এখানে 'অর্ডার' শব্দটি ব্যবহার করা হয়েছে? কোন অনুক্রম বা কিছু আছে? এবং কি করবে বাম অপারেন্ডটি ডান অপরেন্ডের চেয়ে ছোট। ( .orderedAscending) স্ট্রিংয়ের অর্থ
মধু

4
@ মধু তুলনার ফলাফল আপনাকে বলে যে শব্দটি অভিধানের অর্থে অন্যটির চেয়ে আগের দিকে আসে (অর্থাত্ শব্দটি কোনও অভিধানের সামনের দিকে আসে)। .orderedSameমানে স্ট্রিং অভিধানে একই স্পটে শেষ হবে।
সের্গেই কালিনিচেনকো

4
@ মধু এর .orderedSameজন্য সংক্ষিপ্ত ComparisonResult.orderSame... আপনার টাইপটির নাম রাখার দরকার নেই যেহেতু সংকলকটি জানে যে caseInsensitiveCompareএকটি প্রদান করে ComparisonResult। "দুটি অপারেন্ড সমান" - একটি নির্দিষ্ট ক্রম অনুসারে এগুলি সমান ... স্পষ্টতই, "নগদ" এবং "নগদ" অভিন্ন স্ট্রিংয়ের মান নয়। "তবে এখানে 'অর্ডার' শব্দটি কেন ব্যবহৃত হয়েছে?" - কারণ এটি একটি আদেশযুক্ত তুলনার ফলাফল। অন্যান্য মানগুলি orderedAscendingএবং orderedDescending... এটি কেবল একই বা ভিন্নতার প্রশ্ন নয়। "ছোট" হিসাবে: স্ট্রিংগুলি একটি বৃহত বেসের সংখ্যার মতো।
জিম বাল্টার

4
আমার মনে হচ্ছে এটি ভয়ানক এপিআই ডিজাইন। স্বাক্ষরটি পড়া সহজ নয় ... এটি তৈরি a.caseInsensitiveCompare(b, comparing: .orderedSame)করা আরও পঠনযোগ্য হত ...
হানি

25
if a.lowercaseString == b.lowercaseString {
    //Strings match
}

4
খাঁটি সুইফট এখানে যাওয়ার উপায়। ভিত্তির দরকার নেই।
আলেকজান্ডার - মনিকা পুনরায়

4
কেস রূপান্তর এবং তারপরে তুলনা করা ভুল। প্রশ্নের অধীনে মন্তব্য দেখুন।
জিম বাল্টার

4
@ জিমবাল্টার আমি এটি "ভুল" বলব না কারণ এটি ওপির প্রশ্নের উত্তরটিতে দেওয়া উদাহরণটির উত্তর দেয়। আমাদের মধ্যে যাদের স্থানীয়করণের সমর্থন করার প্রয়োজন নেই তাদের পক্ষে এটি অনেক পরিস্কার!
7'18

4
^ না, এটা ভুল। একটি উদাহরণের জন্য কাজ করার কিছু ঘটে তা অপ্রাসঙ্গিক। এই হ্যাক মোটেও "ক্লিনার" নয়। গৃহীত উত্তর সঠিক, পরিষ্কার সমাধান দেয়।
জিম বাল্টার

8

সঠিক পথ:

let a: String = "Cash"
let b: String = "cash"

if a.caseInsensitiveCompare(b) == .orderedSame {
    //Strings match 
}

দয়া করে নোট করুন: তুলনাআরসাল্ট.অর্ডারসেমকে সংক্ষেপে .orderedSame হিসাবেও লেখা যেতে পারে।

অন্যান্য উপায়:

ক।

if a.lowercased() == b.lowercased() {
    //Strings match 
}

খ।

if a.uppercased() == b.uppercased() {
    //Strings match 
}

গ।

if a.capitalized() == b.capitalized() {
    //Strings match 
}

7

শুধু আপনার নিজের রোল করতে পারে:

func equalIgnoringCase(a:String, b:String) -> Bool {
    return a.lowercaseString == b.lowercaseString
}

4
কেস রূপান্তর এবং তারপরে তুলনা করা ভুল। প্রশ্নের অধীনে মন্তব্য দেখুন।
জিম বাল্টার

7

লোকালাইজড কেসআইসেনসেটিভ কনটেনস : কেস-সংবেদনশীল, স্থানীয়-সচেতন অনুসন্ধান সম্পাদন করে রিসিভারের প্রদত্ত স্ট্রিং রয়েছে কিনা তা ফেরত দেয়

if a.localizedCaseInsensitiveContains(b) {
    //returns true if a contains b (case insensitive)
}

সম্পাদিত :

কেসআইএনসেটিসিভ কম্পেয়ার : একমাত্র বিকল্প হিসাবে এনএসকেসিআইএনসেটিসেটিভ অনুসন্ধানের সাথে তুলনা (_: বিকল্প :) ডেকে আনার ফলাফলটি প্রত্যাবর্তন করে।

if a.caseInsensitiveCompare(b) == .orderedSame {
    //returns true if a equals b (case insensitive)
}

4
প্রশ্ন তুলনা সম্পর্কে, সংযোজন নয়।
জিম বাল্টার

যদি "a বি বি থাকে " এবং "বিতে" থাকে তবে সেগুলি সমান। সুতরাং এটি অবশ্যই একটি সম্ভাব্য সমাধান, এমনকি যদি এটি সবচেয়ে কার্যকর নাও হয়।
ফিলিপ মরোর

1

আপনি সমস্ত অক্ষর বড় হাতের অক্ষর (বা ছোট হাতের অক্ষর) তৈরি করতে পারেন এবং দেখতে পারেন যে সেগুলি একই কিনা।

var a = “Cashvar b = “CAShif a.uppercaseString == b.uppercaseString{
  //DO SOMETHING
}

এটি উভয় ভেরিয়েবল হিসাবে তৈরি করবে ”CASH” এবং এইভাবে তারা সমান।

আপনি একটি Stringএক্সটেনশনও করতে পারেন

extension String{
  func equalsIgnoreCase(string:String) -> Bool{
    return self.uppercaseString == string.uppercaseString
  }
}

if "Something ELSE".equalsIgnoreCase("something Else"){
  print("TRUE")
}

4
কেস রূপান্তর এবং তারপরে তুলনা করা ভুল। প্রশ্নের অধীনে মন্তব্য দেখুন।
জিম বাল্টার

1

ফোন নম্বর তুলনা উদাহরণ; দ্রুত 4.2 ব্যবহার করে

var selectPhone = [String]()

if selectPhone.index(where: {$0.caseInsensitiveCompare(contactsList[indexPath.row].phone!) == .orderedSame}) != nil {
    print("Same value")
} else {
    print("Not the same")
}

0

সুইফট 4, আমি স্ট্রিং এক্সটেনশান রুটে কেসআইএনসেটিসিটিকম্পার () কে টেমপ্লেট হিসাবে ব্যবহার করেছিলাম (তবে অপারেন্ডটিকে optionচ্ছিক হতে দিচ্ছি)। এখানে খেলার মাঠটি আমি এটি একসাথে রাখতাম (স্বাগতের তুলনায় সুইফ্টে নতুন তাই প্রতিক্রিয়া)।

import UIKit

extension String {
    func caseInsensitiveEquals<T>(_ otherString: T?) -> Bool where T : StringProtocol {
        guard let otherString = otherString else {
            return false
        }
        return self.caseInsensitiveCompare(otherString) == ComparisonResult.orderedSame
    }
}

"string 1".caseInsensitiveEquals("string 2") // false

"thingy".caseInsensitiveEquals("thingy") // true

let nilString1: String? = nil
"woohoo".caseInsensitiveEquals(nilString1) // false

4
আপনি .orderedSameবরং ব্যবহার করতে পারেন ComparisonResult.orderedSame
জিম বাল্টার

0

কোডের কয়েকটি লাইনের তুলনায় আপনি কেবল আপনার স্ট্রিং এক্সটেনশন লিখতে পারেন

extension String {

    func compare(_ with : String)->Bool{
        return self.caseInsensitiveCompare(with) == .orderedSame
    } 
}

0

সুইফ্ট 5 এর জন্য কেস উপেক্ষা করে দুটি স্ট্রিং তুলনা করুন

var a = "cash"
var b = "Cash"
if(a.caseInsensitiveCompare(b) == .orderedSame){
     print("Ok")
}


-1

সুইফট 3 : আপনি আপনার নিজের অপারেটর, যেমন বর্ণনা করতে পারেন ~=

infix operator ~=

func ~=(lhs: String, rhs: String) -> Bool {
   return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}

যা আপনি তখন কোনও খেলার মাঠে চেষ্টা করতে পারেন

let low = "hej"
let up = "Hej"

func test() {
    if low ~= up {
        print("same")
    } else {
        print("not same")
    }
}

test() // prints 'same'

আমি এটিকে নিম্নমান হিসাবে চিহ্নিত করি নি, তবে মনে রাখবেন যে এটি সাধারণত একটি খুব খারাপ ধারণা, যেহেতু উপরের কাস্টম প্যাটার্ন ম্যাচিং অপারেটর সাধারণত Stringঅন্যের (বা অন্যান্য Stringআক্ষরিক) সাথে মিলের ক্ষেত্রে ব্যবহৃত নেটিভ প্যাটার্ন ম্যাচের চেয়ে বেশি অগ্রাধিকার গ্রহণ করবে । কল্পনা করুন let str = "isCAMELcase"নিম্নরূপ একটি মামলা দিয়ে সুইচ হচ্ছে: case "IsCamelCase": ... । উপরের পদ্ধতিটির সাথে, এটি caseসফলভাবে প্রবেশ করা হবে, যা Stringপ্যাটার্ন মিলের মানক libs বাস্তবায়ন থেকে প্রত্যাশিত নয় । আপডেট হওয়া সুইফ্ট 3 উত্তরটি এখনও ভাল তবে ...
dfrib

... Stringডিফল্ট Stringপ্যাটার্ন ম্যাচটিকে ওভাররাইড না করে উপরের সাহায্যকারী হিসাবে একটি কাস্টম ফাংশন (বা এক্সটেনশন) ব্যবহার করার বিষয়টি বিবেচনা করুন ।
dfrib

-1
extension String
{
    func equalIgnoreCase(_ compare:String) -> Bool
    {
        return self.uppercased() == compare.uppercased()
    }
}

ব্যবহারের নমুনা

print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))

4
এটি কয়েকটি ভাষায় কিছু স্ট্রিংয়ের জন্য কাজ করে না ... প্রশ্নের নীচে মন্তব্যগুলি এবং অনেকগুলি সঠিক উত্তর দেখুন, যার মধ্যে কয়েকটি - স্বীকৃত সহ - কয়েক বছর আগে আপনার পূর্ববর্তী।
জিম বাল্টার

-2

সুইফট 3:

আপনি দুটি স্ট্রিং ফাংশনের মধ্যে স্থানীয় বর্ণিত কেস সংবেদনশীল তুলনাটি ব্যবহার করতে পারেন এবং এটি ফিরে আসে Bool

var a = "cash"
var b = "Cash"

if a.localizedCaseInsensitiveContains(b) {
    print("Identical")           
} else {
    print("Non Identical")
}

4
আপনার সমাধানটি ভুল। স্ট্রিং "ক্যাশা" এবং "নগদ" বিবেচনা করুন
ক্লার্ককক্স 3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.