سؤال

ووه، لقد وصلت إلى المصفوفات الآن، والحمد لله.

الآن، لقد حصلت على 2 صفائف!

int colorvalues[][]  = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};

تخيلها كصورة بحجم 4 × 4 بكسل

الآن، أريد إنشاء رسم بياني لتوزيع قيم الألوان من 0 إلى 255.على سبيل المثال، لدي هنا 2*255، 2*127، 5*34 وهكذا.

لذلك قمت بإنشاء رسم بياني int[] = new int [255];

لاختبار ما إذا كانت قيم الألوان الخاصة بي صحيحة كتبت:

 for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
         System.out.println("Colorvalue in Array " + i + "." + j + " is" + colorvalues[i][j]);
     }
 }

حتى الان جيدة جدا.الآن، كيف أكتب إجراءً ينتقل في الرسم البياني[255] من 0 إلى 255، ومقارنته بقيمة قيم الألوان[][]، وإذا، على سبيل المثال، يقارن الرسم البياني[34] بقيم الألوان[][] ويضيف 5 إلى الرسم البياني [34].لأن هناك 5 ضرب 34 في قيم الألوان[][].

ربما تفكيري خاطئ وكان من المفترض أن يكون لدي رسم بياني [255] []، 255 لقيم الألوان من 0 إلى 255 والآخر للعداد.وحتى ذلك الحين، كيف أدرك ذلك؟

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

المحلول

في الواقع، لا ينبغي عليك التكرار على الرسم البياني ولكل قيمة محتملة التكرار على الصورة.يجب أن يكون التكرار على الصورة كافيًا:

for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
             histogram[colorvalues[i][j]]++;
     }
}

يمكنك ببساطة أن تأخذ قيمة الخفة في صورتك كقيمة فِهرِس في مصفوفة الرسم البياني.

ولا تحتاج إلى إنشاء مصفوفة من المصفوفات فقط لحفظ العداد.تذكر أن المصفوفة ليست أكثر من قائمة "خلايا" بقيمة معينة.ان int[] هو مجرد نطاق من "الخلايا" التي يمكنها الاحتفاظ بقيمة عددية.هذا هو العد الخاص بك.ال فِهرِس في قائمة الخلايا هذه توجد قيمة السطوع للرسم البياني.لكل مصفوفة لديك هاتان القطعتان من المعلومات:فهرس الخلية والقيمة الموجودة في تلك الخلية.تحتاج فقط إلى معرفة كيفية استخدام كليهما.

و كما بي سبيد الملاحظات في التعليق، قد ترغب في التأكد من أن الكود لن يحاول فعليًا الوصول إلى القيم خارج حدود تلك المصفوفة:

if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
    histogram[colorvalues[i][j]]++;
}

وهذا مطلوب لأن قيم اللون الخاصة بك هي ints، أي أنها يمكن أن تحتوي على قيم من −2147483648 إلى 2147483647.وهو نطاق أكبر بكثير مما يمكن أن يستوعبه الرسم البياني الخاص بك.لذا، إذا كانت قيمة اللون 3456 على سبيل المثال، فسيتوقف البرنامج في الحلقة بسبب خطأ ArrayIndexOutOfBoundsException.لأن الكود يحاول الوصول إلى قيمة في ملف histogram مصفوفة ذات فهرس 3456 وهو ما يتجاوز الحد الأقصى للمؤشر القابل للاستخدام وهو 255.

الوقت المتوقع للوصول: أما بالنسبة لكون الرسم البياني الخاص بك int[255]:لقد تجاهلت ذلك تماما، آسف.عند إنشاء مصفوفة جديدة في Java، يمكنك تحديد طول, ، وليس الحد الأقصى للمؤشر.لذا فإن كل ما تستخدمه هناك يكون أكبر بواحد بالضبط من الحد الأقصى للفهرس الذي يمكن استخدامه في المصفوفة.لذا new int[256] عبارة عن مصفوفة تحتوي على فهارس من 0 إلى 255.

نصائح أخرى

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

سيزداد حجم الخريطة تلقائيًا، ولا توجد مشكلات في الفهرس خارج الحدود وما إلى ذلك.سيتم فرزها تلقائيًا حسب ترتيب الحجم.

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