• 0

خطأ عند مقارنة String في لغة جافا

مرحبا! كنت اعمل على مشروع تجريبي وهو روبوت الرد التلقائي

الكود

package MyProject.Robot;

import java.util.ArrayList;
import java.util.Scanner;


public class One {

  public static void main(String[] args) {
    Scanner sca = new Scanner(System.in);
    ArrayList<String> words = new ArrayList<String>();
    words.add("Hello");
    System.out.println("What is your name? ");
    String name = sca.next();
    System.out.print("Message: ");
    String message = sca.next();
    String reply = "Reply: ";
    
    if(message == words.get(0)){
      System.out.println(reply+"Hi!, how are you "+name);
      message = sca.next();
      
    }
    else{
      System.out.println("not understand");
    }
    
  
    
  
  }

}

والتيجة

What is your name? 
sheikh
Message: Hello
not understand

ما الخطأ ولماذا يتجاهل؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0
بتاريخ 47 دقائق مضت قال الشيخ المختار الشنقيطس:

ما الخطأ ولماذا يتجاهل؟

الخطأ أنك تستخدم (==) لفحص التساوي و هذا الرمز نستخدمه لفحص إذا كان المرجع هو نفسه، لفحص تساوي سلسلتين نصيتين من حيث القيمة نستخدم الدالة equals و هذه الدالة حساسة للحروف و بالتالي فإن الكود يُصبح بالشكل التالي:

if(message.equals(words.get(0))){
  System.out.println(reply+"Hi!, how are you "+name);
  message = sca.next();
}

إذا كنت تريد فحص تساوي القيمتين مع عدم أخذ طبيعة الحروف بعين الإعتبار يُمكنك إستخدام equalsIgnoreCase.

بإمكانك تجربة المثال من خلال هذا: الرابط

بالتوفيق.

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

ال == مفهومها مختلف تماما في الجافا أثناء مقارنة two strings.

فلما تضع:

string1 == string2

فالعملية في background تتم بمقارنة المراجع وليس القيم.

أيضا يمكنك حساب طرح string2 من string1 على الشكل التالي:

string1.compareTo(string2)

وكما تلاحظ معي لو أن كلا string1 و string2 متساويان فالنتيجة ستكون 0 وأنت في كودك تتوقع شي true أي 1 في if condition ومنه حتى يعمل معك الكود بشكل صحيح عليك بالمنطق التالي:

if(string1.compareTo(string2) == 0){
  // true
}else{
  //false
}

وبعد تطبيق المنطق على برنامجك:

import java.util.ArrayList;
import java.util.Scanner;


public class Main {

  public static void main(String[] args) {
      
    Scanner sca = new Scanner(System.in);
    ArrayList<String> words = new ArrayList<String>();
    words.add("Hello");
    System.out.println("What is your name? ");
    String name = sca.next();
    System.out.print("Message: ");
    String message = sca.next();
    String reply = "Reply: ";
    
    if(message.compareTo(words.get(0)) == 0){
      System.out.println(reply+"Hi!, how are you "+name);
      message = sca.next();
    }
    else{
      System.out.println("not understand");
    }
  }
}

كما يمكنك فحص البرنامج مباشرة من هنا والنتيجة:

Screenshot_2020-10-26_23-52-47.png.4fee81586ff77677bf416a90da0dcb92.png

كما توجد طريقة أخرى لكنها تتطلب بعض المنطق في الخوارزميات وهي كالتالي:

import java.util.ArrayList;
import java.util.Scanner;


public class Main {
    public static boolean stringCompare(String str1, String str2) { 
        int l1 = str1.length(); 
        int l2 = str2.length(); 
        int lmin = Math.min(l1, l2); 
  
        for (int i = 0; i < lmin; i++) { 
            int str1_ch = (int)str1.charAt(i); 
            int str2_ch = (int)str2.charAt(i); 
  
            if (str1_ch != str2_ch) { 
                return false; 
            } 
        } 
  
        // الحافة لسلاسل مثل
        if (l1 != l2) { 
            return false; 
        } 
  
        // إذا لم يكن أي من الشروط المذكورة أعلاه صحيحًا ،
        // يعني أن كلا السلاسل متساوية
        else { 
            return true; 
        } 
    } 

    public static void main(String[] args) {
      
        Scanner sca = new Scanner(System.in);
        ArrayList<String> words = new ArrayList<String>();
        words.add("Hello");
        System.out.println("What is your name? ");
        String name = sca.next();
        System.out.print("Message: ");
        String message = sca.next();
        String reply = "Reply: ";
        
        if(stringCompare(message, words.get(0))){
          System.out.println(reply+"Hi!, how are you "+name);
          message = sca.next();
        }
        else{
          System.out.println("not understand");
        }
    }
}

كما يمكنك فحص البرنامج مباشرة من هنا والنتيجة:

Screenshot_2020-10-26_23-52-47.png.4fee81586ff77677bf416a90da0dcb92.png

تحياتي.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

مرحبا @الشيخ المختار الشنقيطس

هذا الكود مكتوب بلغة جافا و ليست جافا سكربت

قمت بتعديل السؤال.

تعتبر جافا كل String غرض وليس متحول عادي Data Type  و عند مقارنة الأغراض بجافا عن طريق == لا تقوم بمطابقة القيمة إنما تعيد true في حال الغرضين (المتحولين msg1 == ms2 ) يعودان لنفس المكان من الذاكرة 

حيث سيقارن مثلا @143DF144 مع @42AA32 (حروف و أرقام تمثل موقع المتحول في الذكرة 

بطريقة أخرى هما نفس ال Instance فقط 

طباعة غرض يرجع قيمة مثل :

 getClass().getName() + '@' + Integer.toHexString(hashCode())

يمكنك مراجعة الشرح التالي

بالتوفيق

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0
بتاريخ 2 ساعات قال Wael Aljamal:

مرحبا @الشيخ المختار الشنقيطس

هذا الكود مكتوب بلغة جافا و ليست جافا سكربت

قمت بتعديل السؤال.

تعتبر جافا كل String غرض وليس متحول عادي Data Type  و عند مقارنة الأغراض بجافا عن طريق == لا تقوم بمطابقة القيمة إنما تعيد true في حال الغرضين (المتحولين msg1 == ms2 ) يعودان لنفس المكان من الذاكرة 

حيث سيقارن مثلا @143DF144 مع @42AA32 (حروف و أرقام تمثل موقع المتحول في الذكرة 

بطريقة أخرى هما نفس ال Instance فقط 

طباعة غرض يرجع قيمة مثل :


 getClass().getName() + '@' + Integer.toHexString(hashCode())

يمكنك مراجعة الشرح التالي

بالتوفيق

 لم اقل انها جافا سكربت بل قلت خطأ في جافا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

لا يمكنك مقارنة نصين باستخدام == وانما يجب ان تتم المقارنة من خلال  equals او equalsIgnoreCase

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن