سؤال

لدي حلقة أحسب فيها قيمة وأضفها قائمة. لذا ، أفعل شيئًا كهذا:

x = getValue()
values.add(x)
while (true) {
   x = getValue();
   values.add(x)
}

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

لحل هذه المشكلة فعلت ما يلي:

x = getValue();
Integer[] valueToAdd = new Integer[n];
for (int i=0; i<n; i++) {
   valueToAdd[i] = x[i];
}
while (true) {
   x = getValue();
   y = new Integer[n];
   for (int i=0; i<n; i++) {
      valueToAdd[i] = x[i];
   }
   values.add(valueToAdd)
}

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

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

هل هناك طريقة في جافا لإعادة استخدام نفس الاسم لحالات مختلفة؟

وأضافأحتاج إلى توضيح بعض المشكلات. لم أعرض كل الرمز. لدي break الأمر في الحلقة (عندما لا يمكن إنشاء قيمة جديدة ، أخرج من الحلقة). x و value لديك Integer[] يكتب.

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

   Integer[] x = new x[n];
    while (true) {
       for (int i=0; i<n; i++) {
          x[i] = y[i];
       }
       values.add(x)
    }

ولم ينجح ذلك منذ ذلك الحين values قائمة عناصر متطابقة (وأنا أعلم ذلك في الحلقة في كل دورة x كان لها قيمة جديدة).

وأضاف 3

لماذا يبدو أن جميع عناصر قائمتي هي نفسها؟

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

المحلول

مشكلتك ليست ما تعتقد أنه. على سبيل المثال ، ألقِ نظرة على هذا البرنامج البسيط:

String x = null;
List<String> l = new ArrayList<String>();
for (int i = 0; i < 10; i ++) {
    x = String.valueOf(i);
    l.add(x);
}

System.out.println(l);

يطبع الأرقام من 0 إلى 9. وذلك لأن Java هي قيمة بارة (تحقق هنا). أنت لا تمرر الإشارة إلى x ، فأنت تمر بقيمة x (في add طريقة).

لذا فإن المشكلة تكمن في getValue() الطريقة التي تُرجع نفس الكائن.

تحديث: الآن السؤال منطقي أكثر. أنت تعمل مع نفس الكائن x في كل مرة ، وتغيير حالتها. من أجل وضع قيم مختلفة ، ما عليك سوى نقل الإعلان داخل الحلقة:

while (true) {
   Integer[] x = new x[n];
   ...
}

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

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