كيفية مقارنة سلسلتين في Java

⚡ ملخص ذكي

مقارنة سلسلتين نصيتين في Java يمكن القيام بذلك باستخدام عدة طرق تُطابق سلسلة من الأحرف للتحقق من التساوي أو الترتيب. يشرح هذا المورد سبع طرق، بما في ذلك دالة المساواة في السلاسل النصية، ودالة المساواة في الكائنات، ودالة المقارنة، ودوال StringUtils، ومعامل المقارنة ==، وطريقة مقارنة مخصصة، مع أمثلة لكل منها.

  • 🟰 دالة equals() للسلاسل النصية: يقارن قيمتين نصيتين للتأكد من تساويهما مع مراعاة حالة الأحرف، ويعيد القيمة true أو false.
  • 📦 دالة equals() للكائنات: يقارن بأمان بين سلسلتين نصيتين، ويتعامل مع القيمتين الفارغتين على أنهما متساويتان.
  • 🔤 compareTo(): يقارن السلاسل النصية بالترتيب المعجمي، ويعيد صفرًا أو رقمًا سالبًا أو رقمًا موجبًا.
  • 🧰 طرق StringUtils: تقوم الدالتان equals() و equalsAny() من Apache Commons بمقارنة السلاسل النصية والتعامل مع القيم الفارغة بسلاسة.
  • ⚠️ == Operaتور: يقارن مراجع الكائنات، وليس محتوياتها، لذلك لا ينبغي استخدامه لمقارنة القيم.

كيفية مقارنة سلسلتين في Java

طرق مقارنة السلاسل في Java

Java يوفر طرقًا مختلفة يمكنك الاستفادة منها لمقارنة سلسلتين Java. مقارنة السلسلة في Java هي ميزة تطابق سلسلة من الأحرف مع سلسلة.

لمعرفة كيفية مقارنة السلاسل في Javaيمكنك استخدام الطرق التي توفرها الفئات التالية:

  • فئة String من حزمة java.lang.
  • فئة الكائنات من حزمة java.util.
  • فئة StringUtils من الحزمة org.apache.commons.lang3.

معظم هذه Java تتضمن دوال مقارنة السلاسل حلولاً لتجاهل حالة الأحرف. في هذا الدرس، ستتعرف على الطرق المختلفة التي يمكنك استخدامها لمقارنة سلسلتين نصيتين.

الطريقة الأولى: طريقة السلسلة تساوي ().

استخدم Java خيط يساوي () الأسلوب مقارنة بين كائنين من السلسلة للحصول على قيم سلسلة متساوية.

بناء الجملة:

public boolean equals(Object anObject)

يساوي () معلمات الطريقة:

anObject – سلسلة الوسيطة لمقارنة السلاسل.

يساوي () أنواع الإرجاع

  • يُرجع صحيحًا إذا كانت السلسلة الحرفية المقدمة هي نفس السلسلة الأولى.
  • إرجاع خطأ إذا كانت السلسلة الأولى ليست هي نفس سلسلة الوسيطة.

على سبيل المثال:

public class CompareTwoStrings {
 public static void main(String[] args) {
   String stringOne = "Guru99";
   String stringTwo = "Guru99";
   System.out.println("is Guru99 equal to Guru99: "+stringOne.equals(stringTwo));
   String stringThree = "GURU99";
   System.out.println("is Guru99 equal to GURU99: "+stringOne.equals(stringThree));
  }
}

الناتج المتوقع:

is Guru99 equal to Guru99: true
is Guru99 equal to GURU99: false

التفسير:

  • لقد حصلت على خطأ في الإخراج الأخير لأن الكائن المحدد له حالة مختلفة.

ملاحظة: استخدم دالة equals() للمقارنة بين السلاسل النصية مع مراعاة حالة الأحرف. استخدم دالة equalsIgnoreCase لمقارنة السلاسل النصية مع تجاهل حالة الأحرف.

الطريقة الثانية: الكائنات تساوي طريقة ().

استخدم Java الكائنات تساوي () تقوم الطريقة بمقارنة كائنين من السلسلة لمعرفة ما إذا كان لديهما نفس القيم.

بناء الجملة:

public static boolean equals(Object a, Object b)

يساوي () معلمات الأسلوب

أ - سلسلة وسيطة لكائن السلسلة الأول.

ب - سلسلة وسيطة لكائن السلسلة الثانية.

يساوي () أنواع الإرجاع

  • يُرجع صحيحًا إذا كانت القيم الحرفية للسلسلة متساوية. سيؤدي تمرير قيمة فارغة في الوسيطتين إلى إرجاع صحيح أيضًا.
  • إرجاع خطأ إذا كانت السلسلة الحرفية غير متساوية.

على سبيل المثال:

import java.util.Objects;
public class CompareTwoStrings {
    public static void main(String[] args) {
        String stringOne = "Guru99";
        String stringTwo = "Guru99";
        System.out.println("is Guru99 equal to Guru99: " + Objects.equals(stringOne, stringTwo));
        String stringThree = null;
        String stringFour = null;
        System.out.println("is Guru99 equal to Guru99: " + Objects.equals(stringThree, stringFour));
    }
}

الإخراج:

is Guru99 equal to Guru99: true
is Guru99 equal to Guru99: true

التفسير:

من هذا المثال، يمكنك أن ترى أن الناتج هو قيمة منطقية صحيحة، لأن السلاسل التي تمت مقارنتها متساوية.

الطريقة الثالثة: طريقة مقارنة السلسلة ().

استخدم Java سلسلة مقارنة إلى () تقارن هذه الطريقة بين سلسلتين حسب الترتيب الأبجدي. وعادة ما يشار إليها بالترتيب المعجمي.

بناء الجملة:

public int compareTo(String str)

معلمات طريقة CompareTo()

str - السلسلة المراد مقارنتها بالسلسلة الحالية.

تُرجع طريقة المقارنة إلى ().

  • 0 - يُرجع صفرًا إذا كان الكائن المحدد يساوي السلسلة الحالية.
  • < 0 – إرجاع رقم أقل من الصفر إذا كانت هذه السلسلة أقل من الكائن المحدد.
  • > 0 - يُرجع رقمًا أكبر من الصفر إذا تجاوزت هذه السلسلة السلسلة المتوفرة.

على سبيل المثال:

public class CompareTwoStrings {
    public static void main(String[] args) {
        String stringOne = "Guru99";
        String stringTwo = "Guru99";
        System.out.println("is Guru99 equal to Guru99: " + stringOne.compareTo(stringTwo));
        String stringThree = "GURU99";
		// u = 117, U = 85, result = 117-85 = 32
        System.out.println("is Guru99 equal to GURU99: " + stringOne.compareTo(stringThree));
    }
}

الناتج المتوقع:

is Guru99 equal to Guru99: 0
is Guru99 equal to GURU99: 32

التفسير:

النتيجة الأولى تُرجع قيمة صفر، لأن السلسلتين الأولى والثانية متساويتان.

أما النتيجة الثانية فترجع قيمة اثنين وثلاثين، لأن الأحرف مختلفة.

ملاحظة: لتجاهل حالة الأحرف، يمكنك استخدام طريقة "compareToIgnoreCase".

الطريقة الرابعة: طريقة StringUtils يساوي ().

استخدم Java StringUtils يساوي () تقارن الطريقة بين المساواة بين تسلسلين من الأحرف.

تأكد من إضافة مكتبة "org.apache.commons.lang3" إلى برنامجك. سيتيح لك ذلك مقارنة السلاسل النصية باستخدام دوال StringUtils.

بالنسبة لمشاريع Maven، استخدم هذا توجيه لإضافة المكتبة إلى المشروع.

لكن إذا كنت ترغب في إضافة المكتبة بدون استخدام أي أدوات بناء، فاستخدم هذا توجيه.

بناء الجملة:

public static boolean equals(CharSequence cs1, CharSequence cs2)

StringUtils يساوي معلمات الطريقة ().

  • cs1 – سلسلة من الأحرف للوسيطة الأولى.
  • cs2 – سلسلة من الأحرف للوسيطة الثانية.

تُرجع طريقة StringUtils يساوي ()

  • تُرجع الدالة القيمة "صحيح" إذا كانت مقارنة السلسلتين متطابقة. وينطبق هذا أيضًا في حال تمرير قيمة فارغة (null) في الوسيطين.
  • إرجاع خطأ إذا كانت مقارنة السلسلة غير متساوية.

على سبيل المثال:

import org.apache.commons.lang3.StringUtils;
public class CompareTwoStrings {
    public static void main(String[] args) {
        String stringOne = "Guru99";
        String stringTwo = "Guru99";
        System.out.println("is Guru99 equal to Guru99: " + StringUtils.equals(stringOne, stringTwo));
        String stringThree = "GURU99";
        System.out.println("is Guru99 equal to GURU99: " + StringUtils.equals(stringOne, stringThree));
    }
}

الإخراج:

is Guru99 equal to Guru99: true
is Guru99 equal to GURU99: false

التفسير:

وبما أن محتويات السلسلتين الأولى والثانية متساوية، فإن النتيجة تعود صحيحة.

يمكنك استخدام طريقة "equalsIgnoreCase" لتجاهل الحالة.

الطريقة الخامسة: طريقة StringUtils يساويAny()

استخدم Java StringUtils يساويAny() تتحقق الطريقة من وجود سلسلة في الوسائط.

بناء الجملة:

public static boolean equalsAny(CharSequence string, CharSequence... searchStrings)

معلمات الأسلوب StringUtils يساويAny()

  • سلسلة - قيمة السلسلة للوسيطة الأولى. يمكن أن تحتوي الوسيطة أيضًا على قيمة فارغة.
  • searchStrings - مجموعة من وسيطات السلسلة للطريقة لمعرفة ما إذا كانت سلسلة الوسيطة الأولى موجودة.

تُرجع طريقة StringUtilsequalsAny()‎

  • تُرجع الدالة القيمة "صحيح" إذا كانت السلسلة المراد مطابقتها موجودة ضمن عدد متغير من سلاسل البحث. وينطبق هذا في حال كانت كلتا الوسيطتين فارغتين.
  • إرجاع خطأ إذا كانت السلسلة المراد مطابقتها لا تتطابق مع أي سلسلة في العدد المتغير لسلاسل البحث.

على سبيل المثال:

import org.apache.commons.lang3.StringUtils;
public class CompareTwoStrings {
    public static void main(String[] args) {
        String stringOne = "Guru99";
        String[] stringTwo = new String[] {
            "Guru99",
            "JavaGuru99"
        };
        System.out.println("is Guru99 available: " +
            StringUtils.equalsAny(stringOne, stringTwo));
        String[] stringThree = new String[] {
            "GURU99",
            "JavaGuru99"
        };
        System.out.println("is GURU99 available: " +
            StringUtils.equalsAny(stringOne, stringThree));
    }
}

الإخراج:

is Guru99 available: true
is GURU99 available: false

التفسير:

وبما أن محتويات السلسلة الأولى والسلسلة الثانية متساوية، فإن النتيجة ترجع صحيحة. يمكنك استخدام طريقة "equalsAnyIgnoreCase" لتجاهل الحالة.

الطريقة 6: استخدام عامل ==

يتحقق عامل == على السلاسل من أن مراجع الكائنات لها نفس العنوان.

على سبيل المثال:

public class CompareTwoStrings {
    public static void main(String[] args) {
        String stringOne = "Guru99";
        String stringTwo = "Guru99";
        System.out.println("is Guru99 == to Guru99: " + (stringOne == stringTwo));
        String stringThree = "GURU99";
        System.out.println("is Guru99 == to GURU99: " + (stringOne == stringThree));
    }
}

الناتج المتوقع:

is Guru99 == to Guru99: true
is Guru99 == to GURU99: false

التفسير:

  • تُرجع النتيجة الأولى قيمة منطقية تساوي "صحيح". تُضاف السلاسل النصية ذات المحتوى نفسه إلى نفس مجمع السلاسل النصية، وبالتالي تشترك هذه السلاسل في عنوان واحد.
  • النتيجة الثانية تُرجع قيمة منطقية خاطئة. تحتوي الكائنات على محتويات مختلفة، مما ينتج عنه مجموعات سلاسل نصية مختلفة. هذا يعني أن السلاسل النصية لها مراجع كائنات منفصلة؛ وبالتالي فإن الناتج هو خطأ.

الطريقة السابعة: إنشاء طريقة مخصصة لمقارنة سلسلتين Java

إنشاء طريقة لمقارنة سلسلتين باستخدام الترتيب المعجمي.

بناء الجملة:

public static int compareTwoStrings(String str1, String str2)

معلمات الطريقة المخصصة

  • str1 - السلسلة المراد مقارنتها.
  • str2 - السلسلة المراد المقارنة بها.

إرجاع الطريقة المخصصة

  • 0 - يُرجع صفرًا إذا كانت السلسلة الأولى مساوية للسلسلة الثانية.
  • <0 - إرجاع رقم أقل من الصفر إذا كانت السلسلة الأولى أقل من السلسلة الثانية.
  • > 0 – إرجاع رقم أكبر من الصفر إذا كانت السلسلة الأولى أكبر من السلسلة الثانية.

على سبيل المثال:

public class CompareTwoStrings {
    public static int compareTwoStrings(String stringOne, String stringTwo) {
        int lengthOfStringOne = stringOne.length();
        int lengthOfStringTwo = stringTwo.length();
        int minStringLength = Math.min(lengthOfStringOne, lengthOfStringTwo);
        for (int i = 0; i < minStringLength; i++) {
            char stringOneCharValue = stringOne.charAt(i);
            char stringTwoCharValue = stringTwo.charAt(i);
            if (stringOneCharValue != stringTwoCharValue) {
                return stringOneCharValue - stringTwoCharValue;
            }
        }
        if (lengthOfStringOne != lengthOfStringTwo) {
            return lengthOfStringOne - lengthOfStringTwo;
        } else {
            return 0;
        }
    }
    public static void main(String[] args) {
        String stringOne = "Guru99";
        String stringTwo = "Guru99";
        System.out.println("is Guru99 equal to Guru99: " + compareTwoStrings(stringOne, stringTwo));
    }
}

الناتج المتوقع:

is Guru99 equal to Guru99: 0

التفسير:

أرجعت النتيجة قيمة صفر، مما يعني أن الوظيفة المخصصة تعمل كما هو متوقع.

الأسئلة الشائعة

نعم. يمكن لمساعدي الذكاء الاصطناعي أن يقترحوا دوال equals أو compareTo أو StringUtils بناءً على هدفك، وأن ينبهوك إلى مشكلة استخدام == الشائعة. مع ذلك، يُنصح بتأكيد الاختيار بإجراء اختبارات على بياناتك الخاصة.

نعم. تكشف أدوات الذكاء الاصطناعي عن سوء استخدام علامة المساواة (==) لمقارنة المحتوى، وتقترح استخدام علامة المساواة (equals) أو علامة المساواة مع تجاهل حالة الأحرف (equalsIgnoreCase) بدلاً منها. يساعد هذا في تقليل أخطاء المساواة الدقيقة الشائعة لدى المبتدئين الذين يتعاملون مع النصوص.

يقارن عامل المقارنة == مراجع الكائنات، وليس محتوياتها. قد يكون لسلسلتين نصيتين لهما نفس القيمة مراجع مختلفة، لذا قد يُرجع == القيمة false. استخدم دالة equals() لمقارنة القيم بشكل موثوق.

دالة equals() حساسة لحالة الأحرف، لذا "Guru"99" و "GURU99" غير متطابقتين. تقوم الدالة equalsIgnoreCase() بمقارنة السلاسل النصية مع تجاهل اختلافات الأحرف الكبيرة والصغيرة، وتعيد القيمة "صحيح" لكلا السلسلتين.

تلخيص هذه التدوينة بـ: