اذهب إلى المحتوى
  • 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

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

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

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

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

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

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

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

بالتوفيق.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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())

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

بالتوفيق

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...