سؤال

تكرار ممكن:
كيف تنفصل عن الحلقة الرئيسية/الخارجية في حلقة مزدوجة/متداخلة؟

لدي الحالة التالية:

      for(int i = 0; i < schiffe.length-1; i++){
            if(schiffe[i].schaden){
                schlepper.fliege(schiffe[i].x, 
                                 schiffe[i].y, 
                                 schiffe[i].z);
                schlepper.wirdAbgeschleppt = schiffe[i];
                for(int k = 0; k < stationen.length-1; k++){
                    if(stationen[k].reparatur == null){
                        schlepper.fliege(stationen[k].x,
                                         stationen[k].y,
                                         stationen[k].z);
                        break;
                    }
                }
            }
        }

أريد أن

schlepper.fliege(stationen[k].x,
                 stationen[k].y,
                 stationen[k].z);

يتم تنفيذها مرة واحدة ثم الخروج من الحلقة الداخلية وتواصل مع (int i ... حلقة. لذلك استخدمت استراحة في الكود الخاص بي. لكنني لست متأكدًا مما إذا كان هذا صحيحًا. لجميع الحلقات أو فقط للحلقة الثانية؟

هل كانت مفيدة؟

المحلول

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

schiffe_loop:
for(int i = 0; i < schiffe.length-1; i++){
    some_stuff();
    for(int k = 0; k < stationen.length-1; k++){
        if (something_really_bad_happened()) {
            break schiffe_loop;
        }
    }
}

ولكن عادة لن تحتاج إلى هذا.

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

أيضًا ، يرجى العلم أن حلقاتك الآن ستغيب عن العنصر الأخير من كل صفيف. فكر بعناية في سبب استخدامك <بدلاً من <= ؛ إنه بالضبط حتى تستخدم كل قيمة من 0 إلى ولكن ليس بما في ذلك واحد محدد.

نصائح أخرى

break سوف يكسر حلقة الأعمق ، في حلقة قضيتك الثانية.

لجعلها تحطم الحلقة الخارجية ، يمكنك استخدام استراحة مسموعة على النحو التالي:

OUTER:for(...) {
         for(...) {
            break OUTER;
         }
      }

break ينفصل فقط من حلقة الأعمق.

سيؤدي الفاصل إلى استراحة لأقرب حلقة فقط (حلقة ثانية)

فقط الثاني. يمكنك استخدام "goto" بالطبع.

ينتهي بيان BREACH أقرب حلقة أو مفتاح التبديل الذي يظهر فيه في العديد من اللغات ولكن يمكنك تجربته والتأكد من 100 ٪.

ضع حلقتين داخليتين في وظيفة واستخدم العودة للخروج من كل منهما.

إذا كنت بحاجة إلى مزيد من التحكم ، فيمكنك استخدام استراحة ذات علامات. مزيد من المعلومات هنا. كما قال آخرون ، سيغلق Break أقرب حلقة.

ماذا عن استخدام منطقية تسميها "تم العثور عليها" واستخدمها على هذا النحو:

while(!found) {
    for(...) {
        //todo
    }
}

أعتقد أنه يمكنك فعل شيء آخر ..

لـ (int k = 0 ؛ k <stationen.length-1 ؛ k ++) {if (stationen [k] .reparature == null) {schlepper.fliege (stationen [k] .x ، stationen [k] .y ، stationen [ك] .z) ؛

                   k =  stationen.length + 1 ;

                }
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top