سؤال

Integer[] lastExchange = new Integer[nColors];
Integer[] exchangeToAdd = new Integer[nColors];
lastExchange = getValue();
exchangeToAdd = getValue(); 
exchanges.add(exchangeToAdd);

Integer[] newExchange = new Integer[nColors];
while (true) {
   newExchange = getValue(lastExchange);
   Integer[] exchangeToAddForLoop = new Integer[nColors];
   for (int i=0; i<nColors; i++) {
      lastExchange[i] = newExchange[i];
      exchangeToAddForLoop[i] = newExchange[i];
  }
  exchanges.add(exchangeToAddForLoop);
}

وأضاف

ما الذي أحاول فعله بهذا الرمز؟ أحتاج إلى ملء (ملء) القائمة المسمى exchanges. العنصر الأول من القائمة هو lastExchange. مشكلتي في الكود هي أنني بحاجة دائمًا إلى إنشاء اثنين من التكرارات من المتغير (وهذا هو السبب في أنني أعتقد أن الكود ليس أنيقًا ولكن لا يمكنني العثور على حل أفضل). على سبيل المثال ، في البداية أقوم بإنشائها lastExchange ثم أقوم بإنشاء exchangeToAdd (هذا له نفس القيمة lastExchange). الشيء نفسه يحدث في الحلقة. انا صنعت lastExchange ثم أقوم بإنشاء exchangeToAddForLoop. أفعل ذلك لأنني لا أستطيع الإضافة lastExchange إلى القائمة لأنه سيتم تعديله الأخير.

وأضاف 2

ها هي مشكلتي. لدي الرمز من هذا القبيل:

Integer[] e  = getValue();
Integer[] e1 = getValue();  // <-- I do not like that.
exchanges.add(e1);          // <-- I do not like that.
while (true) {
   Integer[] e_new = getValue(e);
   Integer[] e2 = new Integer[nColors]; // <-- I do not like that.
   for (int i=0; i<nColors; i++) {
      e[i] = e_new[i];
      e2[i] = e_new[i]; // <-- I do not like that.
  }
  exchanges.add(e2); // <-- I do not like that.
}

وأنا بحاجة إلى حساب e1 و e2 بالإضافة إلى حساب e.

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

المحلول

هذا هو رمز inelegant بطريقتين على الأقل:

  • يتم تعيين معظم المتغيرات المحلية التي يتم تكليفها بعد ذلك فورًا
  • لك newExchange يمكن إعلان المتغير المتداخل بعمق.

لذلك دون تغيير أي سلوك ، إليك نسخة أجمل:

Integer[] lastExchange = getValue();
Integer[] exchangeToAdd = getValue();
exchanges.add(exchangeToAdd);

while (true) {
   Integer[] newExchange = getValue(lastExchange);
   Integer[] exchangeToAddForLoop = new Integer[nColors];
   for (int i=0; i<nColors; i++) {
      lastExchange[i] = newExchange[i];
      exchangeToAddForLoop[i] = newExchange[i];
   }
   exchanges.add(exchangeToAddForLoop);
}

بعد ذلك ، وصلنا إلى المشكلة التي لم تخبرنا بها ما هو المقصود من أي من هذا الرمز أن يفعله ، ولا ما تعنيه بـ "مشكلة المتغير المحلي المكررة". أوه ، وكما أشار إلى التعليقات ، فإن حلقةك لا تنتهي أبدًا.

نصائح أخرى

دون مناقشة الكود الخاص بك ، عندما يكون لديك أخطاء متغيرة مكررة ، يمكنك دائمًا استخدام {}.

هذا لا يجمع

            int a=0;
            a++;


            int a=0;
            a++;

هذا لا:

        {
            int a=0;
            a++;
        }
        {
            int a=0;
            a++;
        }

تبسيط @جون هو الأكثر أمانًا ، لكنني أظن أنه يمكن تبسيطه بشكل أكبر.

exchanges.add(getValue());

while (true) { // forever??
   // do you need null values or can you use int[]
   int[] newExchange = getValue(exchanges.get(exchanges.size()-1);
   // do you need to add a copy, if not then clone() can be dropped.
   exchanges.add(newExchange.clone());
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top