سؤال

كثيرا ما أرى مثل كود:

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

ولكن أنا أكتب هذا (عندما جافا 1.5 ليست متاحة أو بعضها لا يمكن استخدامها) مثل:

for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

لأن

  • هو أقصر
  • فإنه يحتفظ i في نطاق أصغر
  • فإنه يقلل من فرصة الارتباك.(هو i تستخدم خارج حين ؟ أين هو i أعلن؟)

أعتقد رمز يجب أن تكون بسيطة لفهم ممكن حتى أستطيع أن جعل التعليمات البرمجية المعقدة أن تفعل أشياء معقدة.ماذا تعتقد ؟ الذي هو أفضل ؟

من: http://jamesjava.blogspot.com/2006/04/iterating.html

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

المحلول

أنا أفضل حلقة لأنه أيضا مجموعات نطاق التكرار إلى مجرد حلقة.

نصائح أخرى

هناك مناسبة للاستخدامات حين ، ، ، foreach بنيات:

  • while - استخدام هذا إذا كنت بالتكرار و العامل الحاسم بالنسبة حلقات أو لا تستند إلى مجرد شرط.في هذه الحلقة بناء على مؤشر ثانوية فقط قلق ؛ كل شيء يجب أن يكون على أساس حالة

  • for - استخدام هذا إذا كنت حلقات الشاغل الرئيسي الخاص بك هو مؤشر مجموعة/مجموعة/قائمة.هو أكثر فائدة لاستخدام إذا كنت أكثر من المرجح أن تذهب من خلال كل العناصر على أي حال ، في ترتيب معين (على سبيل المثال ، إلى الوراء من خلال فرز القائمة ، على سبيل المثال).

  • foreach - استخدام هذا إذا كنت فقط تحتاج إلى الذهاب من خلال جمع الخاصة بك بغض النظر عن النظام.

طبعا هناك بعض الاستثناءات المذكورة أعلاه, ولكن هذه هي القاعدة العامة التي يمكنني استخدامها عند اتخاذ قرار استخدام.أن يقال أنا أميل إلى استخدام foreach في كثير من الأحيان.

لماذا لا تستخدم ل-كل بناء?(أنا لم تستخدم جافا في حين ، ولكن هذا موجود في C# و أنا متأكد جافا 1.5 هذا أيضا):

List<String> names = new ArrayList<String>();
names.add("a");
names.add("b");
names.add("c");

for (String name : names)
    System.out.println(name.charAt(0));

أعتقد نطاق أكبر مشكلة هنا ، كما أشرتم.

في "حين" على سبيل المثال ، التكرار أعلن خارج حلقة, لذلك سوف لا تزال موجودة بعد الحلقة القيام به.قد يتسبب هذا في مشاكل إذا نفس هذا التكرار هو استخدامها مرة أخرى فيما بعد.E.ز.كنت قد نسيت تهيئة عليه قبل استخدامه في حلقة أخرى.

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

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

IMHO ، بالنسبة حلقة أقل للقراءة في هذا السيناريو ، إذا نظرتم إلى هذا القانون من وجهة نظر اللغة الإنجليزية.أنا أعمل على مدونة فيها المؤلف لا إساءة بالنسبة حلقة ، و ليس جميلا.قارن التالية:

for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;

مقابل

while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}

وأود أن نتفق على أن "عن" حلقة أكثر وضوحا و أكثر ملاءمة عندما بالتكرار.

و "حين" حلقة المناسب الاقتراع ، أو من حيث عدد الحلقات لتلبية الخروج من حالة التغيير على أساس النشاط داخل الحلقة.

لا أنه ربما يهم في هذه الحالة ، ولكن المجمعين ، VMs وحدة المعالجة المركزية عادة خاصة تقنيات التحسين أنهم المستخدم تحت غطاء محرك السيارة من شأنها أن تجعل الحلقات أداء أفضل (و في القريب الموازية) في عام أنها لا تفعل ذلك مع الحلقات (لأن من الصعب تحديد كيف يجري الأمر لتشغيل).ولكن في معظم الحالات رمز الوضوح أن ترامب الأمثل.

باستخدام حلقة يمكنك العمل مع متغير واحد ، كما أنه يحدد نطاق متغير جاري العمل على الحلقة فقط.ولكن هذا غير ممكن في حين حلقة.على سبيل المثال:
int i;for(i=0;in1;i++) تفعل شيئا..

for(i=0;i n2;i+=2) تفعل شيئا.

وذلك بعد 1 حلقة i=n1-1 في نهاية المطاف.ولكن في حين تستخدم الثانية حلقة يمكنك تعيين مرة أخرى إلى 0. ومع ذلك

int i=0;

بينما(أنا أقل من الحد) { لا شيء ..;i++;}

وبالتالي لم يتم تعيين إلى الحد-1 في نهاية المطاف.إذا كنت غير قادر على استخدام نفس أنا في آخر أثناء الحلقة.

إما على ما يرام.تستخدم () نفسي و لا أعلم إذا كان هناك تجميع القضايا.وأظن أنها على حد سواء الحصول على محسن وصولا الى حد كبير نفس الشيء.

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

كنت في حلقة من أجل الوضوح.بينما استخدم في حين حلقة عندما تواجه مع بعض undeterministic الشرط.

كلاهما جيد ولكن تذكر أنه في بعض الأحيان الوصول إلى التكرار مباشرة مفيد (مثل إذا كنت تقوم بإزالة العناصر التي تتطابق مع حالة معينة - سوف تحصل على ConcurrentModificationException إذا كنت لا جمع.إزالة(س) داخل أجل(T o :جمع) حلقة).

أنا أفضل أن أكتب عن(بلاه :إلخ) [foreach] بناء الجملة تقريبا كل الوقت لأنه يبدو أكثر طبيعية للقراءة بالنسبة لي.مفهوم التكرار في العامة لا يكون التشابه خارج البرمجة

الأكاديمية يميل إلى تفضيل بينما حلقة كما أنه يجعل أقل تعقيدا التفكير حول البرامج.كنت تميل إلى تفضيل أو foreach حلقة الهياكل كما أنها تجعل من الأسهل لقراءة التعليمات البرمجية.

على الرغم من أن كلاهما جيد حقا, أنا أميل إلى استخدام المثال الأول لأنه أسهل في القراءة.

هناك عدد أقل من عمليات يحدث في كل سطر مع الوقت() حلقة ، مما يجعل رمز من الأسهل لشخص جديد على مدونة لفهم ما يجري.

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

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