الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف اقارن بين الاشياء داخل array

مغلق
بدأه شاب مسلم في 30 مارس 2005 · 9 رد · 964 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
public boolean testDuplcateKey(String [] a)
	{
  boolean empty = false;

  for (int i=0; i<a.length-1; i ++)
  {
 	 if(a .equals(a [i+1] ))

    return true;
  }
  return empty;

	}

أخواني الكرام الكود اعلاه يعمل بشكل جيد

ولكن المشكلة انه يقارن اول شيء مع ثاني شيء داخل array

ولكني اريده يقارن اول شيء مع كل الـ arry

فكيف اعمل هذا

هل عن طريق for loop

#2

في الغالب تحتاج إلى لوب داخل nested loop أحدها يأخذ الحرف والآخر يمر على كل المصفوفة

public boolean testDuplcateKey(String [] a)
{
 boolean empty = false;

 for (int i=0; i<a.length-1; i ++)
 {
   for (int y=0; y<a.length-1; y ++)
   {
        if(a .equals(a [y] ))
         return true;
    }
 }
 return empty;

}

لكن لاحظ أنه سيمر على كل المصفوفة بما فيها الحرف نفسه

لنفرض مثلاً أن الكلمة هي :

blue

بمعنى أن المصفوفة هي:

a = {"b","l","u","e"};

يفترض أن تبقى قيمة empty = false

المشكلة هي أن اللوب سيأخذ العنصر الأول وهو b ليمر على كل الحروف وبالتالي فأول حرف سيمر عليه هو نفس الحرف b

لتفادي هيه المشكلة يمكننا استخدام كلمة :

continue

بحيث نعمل if اذا كان العنصر هو نفسه لا تقرأه واستمر في اللوب

وبالتالي تكون الطريقة :

public boolean testDuplcateKey(String [] a)
{
 boolean empty = false;

 for (int i=0; i<a.length-1; i ++)
 {
   for (int y=0; y<a.length-1; y ++)
   {
        if(i=y){continue;)
        if(a .equals(a [y] ))
            return true;
    }
 }
 return empty;

}

أتمنى تضبط معك

تم تعديل هذه المشاركة بواسطة خـالد في 30 مارس 2005 في 13:59

#3

أخي الكريم

لا ادري كيف اشكرك

ليس لأنك حليت لي المشكلة

ولكن لطريقة عرض المشكلة خطوه خطوه مع ابراز الحل

اخي الكريم لا استطيع ان اشكرك على ما قمت حسب ظني

غير اني ادعوا الله لك بالتوفيق في الدنيا والاخرة

وان يرزقك الله ما تريد وان يحفظك ربي بحفظه

علما ان هذا هو الكود في شكله النهائي بعد ان اختبرته

public boolean testDuplicateKey(String [] a)
	{
	boolean duplicate = false;

	for (int i=0; i<a.length-1; i ++)
	{
   for (int y=0; y<a.length; y ++)
   {
        if(i==y){continue;}
        if(a .equals(a [y] ))
            return true;
    }
	}
	return duplicate;

}

علما ان هذه اول مرة اعرف كلمة

continue

وهذه اول مرة استخدمها

فبارك الله فيك اخي الكريم

تم تعديل هذه المشاركة بواسطة شاب مسلم في 30 مارس 2005 في 15:18

#4

سؤال آخر

أريد ان اتأكد ان في كل مكان داخل الـ array

يوجد حرف واحد فقط وليس أكثر

فهل هذا الكود يستطيع القيام بالمهمة

علما انه اثناء الكومبايل بيخرج ان هناك خطا

public boolean testMoreThanOneLetterInKey(String [] n)
     {
      boolean e = false;

      for(int i= 0; i< n.length; i++)
      {
     	 if(n.length >1)
     	 return true;
      }
      return e;
    }

أما الخطا فهو

cannot resolve symbol

symbol : variable length

location: class java.lang.String

if(n.length >1)

^

1 error

Tool completed with exit code 1

#5

هل فهمت الخطأ؟؟

يقول الحاسب لك:

cannot resolve symbol لم أفهم هذه الكلمة!!!

symbol : variable length الكلمة هي length

location: class java.lang.String فهي غير موجودة في الفئة String كما تعلم!

if(n.length >1) ومكان الخطأ هنا...

^

1 error وجدنا في شفرتك خطأ واحد!!

الحل يا عزيزي هو:

n عبارة عن مصفوفة من الكلمات أو String. فهي ليست String بل هي مصفوفة من نوع String... هل هذا مفهوم؟

من المكونات الداخلية لأي مصفوفة هو (عدد الخانات) والمسمى بـ length،،، لذلك تستطيع أن تعرف حجم المصفوفة بهذه الطريقة n.length

أما عن [ رقم ] n فهو عبارة عن String. وهي ليست مصفوفة! فهي ليست إلا خانة في المصفوفة ونوعها String!! كما تعلم أن String ليست لديها مكون الطول length مثل المصفوفة، لكن لديها دوال كثيرة تستطيع أن تستكشف كثيرا منها هنا:

http://java.sun.com/j2se/1.4.2/docs/api/ja...ang/String.html

ولو تفحصت الوصلة السابقة، فستجد أن String لها أمر أو طريقة تعرف بها طول الكلمة وهي size()

فكل ما عليك إذن أن تفعله هو كتابة:

n.size(); //method in class String

الوصلة السابقة بها شروحات جميع الدوال في الجافا!

بالتوفيق!

#6

أخي الكريم ابو مازن

جزاكم الله خيرا على المساعده

ولكن في حقيقه الامر اعتقد ان ما ذهبت إليه ليس صحيحا

حيث ان كل ما في الامر هو

اضافه

n.length()

وليس كما كتبت لي في ردك اعلاه

n.size(); //method in class String

وهذا هو شكل الكود النهائي بعد ان جربته واشتغل تماما

public boolean testMoreThanOneLetterInKey(String [] n)
    {
     boolean e = false;

     for(int i= 0; i< n.length; i++)
     {
      if(n.length() >1)
      return true;
     }
     return e;
   }

وشكرا مرة ثانية لكم جميعا على المساعده

تم تعديل هذه المشاركة بواسطة شاب مسلم في 31 مارس 2005 في 23:03

#7

ممتاز، الحمدلله أنك استنتجت الطريقة بنفسك!!!

فعلا، آسف أخطأت،

عموما يمكنك تصفح الكثير من الأوامر في String في الوصلات السابقة ، وابحث عن length() طبعا وغيرها الكثير!

#8

السلام عليكم

عندى استفسار

في المشاركه رقم 2 وكانت من الاخ خالد

public boolean testDuplcateKey(String [] a)
{
boolean empty = false;

for (int i=0; i<a.length-1; i ++)
{
  for (int y=0; y<a.length-1; y ++)
  {
       if(a .equals(a [y] ))
        return true;
   }
}
return empty;

}

استفساري هو لو وضعت بداية العد للمتغير y هو الواحد (أو i + 1)

for (int i=0; i<a.length-1; i ++)
{
  for (int y=1; y<a.length-1; y ++)
  {

فهل الحل سيكون صحيح

ثانيا ما هو العمل الذي قام به أمر continue

وشكرا

11_03_06_12_48_57_1142110137Image(_66).jpg

#9

أخي الكريم

لقد جربت على الكود الخاص بي

ما قلته

وهو

"استفساري هو لو وضعت بداية العد للمتغير y هو الواحد (أو i + 1) "

ولكن لم يعمل الكود بشكل صحيح

ثانيا

" ثانيا ما هو العمل الذي قام به أمر continue"

فهو اذا حدث الشرط الذي قبل كلمة continue

فتغاضى عنه واستمر في عملكط كان شيئا لم يكن

حيث كما هو معلوم لديكم اخي الكريم انه في هذا الكود لو وجد حرفين متشابهين

مثلا في الخانه الرابعه والخامسه

مباشرة سيتوقف الكود وسيغير

return true;

ولكن

continue

هي الاستثناء من هذا الشرط

هل وضحت الفكرة

====

واترك التعليق والشرح بشكل افضل لاخي الكريم خالد

ودمتم في خير

#10

وفيت وكفيت اخوي شاب مسلم

شرح واضح و مفهوم لعمل continue

و ايضا جربتها في كود بسيط وضح الفكره أكثر

شكرا لك و الشكر موصول للاخ خالد ايضاً.

11_03_06_12_48_57_1142110137Image(_66).jpg

هذا الموضوع مغلق.

مواضيع مشابهة