اذهب إلى المحتوى

السؤال

نشر
int[] arr1 = {5,122,1,44,1,6,4,1,33,1,89,1,225,162,1,1,1,75,11,1,1,1}; 
int remove = 1;

for(int i = 0; i < arr1.length ; i++) { 
    if(remove == arr1[i]) {
        for(int j = i; j <arr1.length - 1; j++) {
            arr1[j] = arr1[j+1];
        }
        break;                                                  
    }
}
for(int i = 0; i<arr1.length-1; i++) {
       System.out.print(arr1[i] + " ");
       }
}

أريد إزالة الرقم 1 من المجموعة! ما بتنجح لماذا !!
ولكن بعد تغيير الرقم واحد إلى أي رقم من المصفوفة سيتم إزالته! ولكن لماذا لا يمكنني إزالة الرقم 1 من هذه المجموعة؟

Recommended Posts

  • 1
نشر

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

أولاً احسب عدد مرات التكرار، ثم أنشئ مصفوفة أخرى حيث ستخزن باقي الأرقام.

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

int[] arr1 = {5,122,1,44,1,6,4,1,33,1,89,1,225,162,1,1,1,75,11,1,1,1};
    int remove = 1;

    int occurences =0, counter=0;

    for(int i = 0; i < arr1.length ; i++) {
        if(remove == arr1[i]) {
            occurences++;
        }
    }

   int[] subArray = new int[arr1.length - occurences];


    for(int i = 0; i < arr1.length ; i++) {
        if(remove != arr1[i]) {
           subArray[counter++] = arr1[i];
        }
    }

    for(int i=0; i< subArray.length; i++){
        System.out.print(subArray[i] + " ");
    }

 

  • 1
نشر

هناك عدة أخطاء لديك،

  • انت لا تقوم بإزالة العدد من المصفوفة بل تقوم بتجاهله والكتابة فوقه مما يؤدي إلى تكرار العنصر الأخير من المصفوفة
  • عند أول ذكر للعدد المراد حذفه تطبق عملية الحذف (ولو كانت بشكل خاطئ) ثم تتوقف عن معالجة بقية العناصر
بتاريخ 10 دقائق مضت قال khaled0mohammed:

ولكن بعد تغيير الرقم واحد إلى أي رقم من المصفوفة سيتم إزالته! ولكن لماذا لا يمكنني إزالة الرقم 1 من هذه المجموعة؟

السبب ظاهريا لان باقي الأعداد غير مكررة أساسًا، مما يعطي انطباع ان الرقم تم حذفه

 

في حال كنت تريد تطبيق الحذف دون تغيير طول المصفوفة كما هو الحال لديك يمكنك ذلك كالتالي،

  1. إزالة الكلمة break حتى يتم معالجة جميع عناصر المصفوفة
  2. تبديل العنصر المساوي للعنصر المرغوب بحذفه ب null
  3. عند الطباعة تتجاهل العناصر التي قيمتها null

يصبح الحل كالتالي

int[] arr1 = {5,122,1,44,1,6,4,1,33,1,89,1,225,162,1,1,1,75,11,1,1,1}; 
int remove = 1;

for(int i = 0; i < arr1.length ; i++) { 
    if(remove == arr1[i]) {
      arr1[i] = null; // تعيين قيمة بديلة عن العنصر المحذوف
    }
}
for(int i = 0; i<arr1.length-1; i++) {
    if(arr1[i] === null) continue; // تجاهل طباعة العناصر المحذوفة (المستبدلة)
    System.out.print(arr1[i] + " ");
}

 

  • 1
نشر

بالإضافة إلى الإجابات بالأعلى يوجد طرق قعالة تُستخدم لتصفية العناصر المكررة في لغة جافا

  1. إن كنت تستخدمم الإصدار الثامن أو أعلى من لغة جافا يمكنك إستخدام الصنف Arrays الذي يوفر دالة stream التي تقوم بالعديد من العمليات الشائعة بشكلٍ جاهز, على سبيل المثال لتحقيق المطلوب من إزالة العناصر المتكررة يمكن كتابة الشفرة التالية 
    Arrays.stream(arr).distinct().toArray();

     

  2. يمكنك أيضًا إستغلال خصائص هيكل البيانات set والذي من خصائصه أن لا يمكن تكرار العناصر فيه حيث يمكنك تحويل المصفوفة إلى set ومن ثم إعادة تحويل الset إلى مصفوفة مرة أخرى بحيث يتم إزالة التكرار كما في الشفرة التالية 

    Set<> tempSet  = new HashSet<>(Arrays.asList(array));
    int[] filteredArray = tempSet.toArray(new int[tempSet.size()]);

     

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...