أكثر من ذلك بكثير نسخة أبسط: الطبقة العامة موفينغافيراجينزليدينغويندو ويندوزيز قائمة انتظار الطابور إنت سوم عامة موفينغافيراجينزليدينغويندو (إنت ويندوززيزي) this. windowsize ويندوززي this. queue جديد لينكدليست () this. sum 0 يجد المتوسط المتحرك بعد إدراج البند n في تدفق البيانات خاصة مزدوجة فيندوفينغافيراج (إنت n) إف (queue. size () غب وينديز - 1) سوم سوم - queue. poll () queue. offer (n) سوم سوم n ريتورن (دوبل) سوم queue. size () ستاتيك فواد مين (سترينغ أرجس) إنت (1) لوت 20 i) System. out. println (كوتافتر إضافة كوت i كوت إلى قائمة الانتظار: متوسط: كوت m. findMovingAverage (i)) يمكننا ببساطة الاستمرار في المجموع الحالي للعناصر في قائمة الانتظار في المتغير العالمي. وهكذا، والحد من حساب في الطريقة التالية (). الطبقة العامة موفينغافيراج لينكدليست كويو إنت سيز إنت سوم 0 هولدز سوم ذي كويو قم بتهيئة بنية البيانات الخاصة بك هنا. (الحجم الداخلي) this. queue جديد لينكدليست () this. size حجم عام مزدوج التالي (إنت فال) queue. offer (فال) سوم فال إف (queue. size () gtthis. size) سوم - queue. poll () تنفيذ قائمة انتظار فيفو ثابتة الطول في جافا عند العمل مع بيانات السلاسل الزمنية، يحتاج المرء في كثير من الأحيان إلى حساب مبالغ الأرقام المتتالية للإطار الزمني المحدد سلفا. تخيل على سبيل المثال حساب المتوسط المتحرك بحجم ثابت. Let39s ننظر في سلسلة زمنية بسيطة جدا. على افتراض متوسط متحرك طول 4 النتائج في الصفيف التالي: الصيغة لمتوسط متحرك طول 4 وبالتالي هي: ما t (مجموع كل العناصر من t-3 إلى t) 4 كيف يمكننا تنفيذ هذا بكفاءة في التعليمات البرمجية جافا المشكلة هي أننا بحاجة إلى حساب المجموع في الصيغة لكل متوسط متحرك. وبطبيعة الحال فمن الممكن أن نكرر دائما على جميع الأرقام في الإطار الزمني الحالي للقيام بذلك، ولكن هذا بطيء دون داع. بدلا من ذلك، يمكننا ببساطة طرح العنصر الأخير في الإطار الزمني وإضافة أحدث واحد إلى مجموع. وبهذه الطريقة يمكننا حفظ عدد كبير من الحسابات غير الضرورية. لا يزال علينا أن نتتبع ما هي في الواقع العناصر القديمة والجديدة. لدينا لتخزين هذه الأرقام في مكان ما. ومن شأن بنية البيانات المناسبة أن تكون قائمة بأولويات في البداية (فيفو) للأرقام. ولكن كيف يمكن بالضبط أن يتم تنفيذ طابور فيفو بلغة برمجة (غير وظيفية) مثل جافا الفكرة الأولى هي عادة استخدام تطبيق قائم على المصفوفة ولتحويل موضع العناصر في المصفوفة من خلال إنشاء نسخ متغيرة قليلا من المصفوفة. في المثال السابق، سنحتاج إلى إنشاء مصفوفة جديدة خمس مرات، مرة واحدة لكل سوم جديد يتم حسابه. هذا بالطبع غير فعالة للغاية، لأن إنشاء صفيف في الذاكرة بطيء نسبيا. التطبيقات القائمة على فئات مثل java. util. ArrayList أو java. util. Vector هي بالفعل أفضل بكثير، لأن داخليا أنها تعتمد على صفائف أطول والمؤشرات. لا يزال هذا ليس الحل الأفضل، لأنه بمجرد تحرك المؤشرات الداخلية خارج حدود array39s الداخلية يجب إنشاء نسخة جديدة من المصفوفة الداخلية. وبالتالي، فإن البديل النموذجي لتنفيذ طوابير فيفو يستخدم قائمة مرتبطة: الميزة واضحة، ولا توجد نسخ أو إعادة إنشاء صفائف في الذاكرة. كل ما علينا القيام به هو التلاعب بضعة مؤشرات. وبطبيعة الحال نفقد ميزة التقييم المباشر لعنصر في قائمة الانتظار من قبل المؤشر، ولكن لغرضنا - حساب المتوسطات المتحركة - وهذا شيء نحن لا نريد أن نفعل على أي حال. يوم أمس، وقعت فجأة لي أن هناك في الواقع بديل أفضل إذا تم إصلاح طول قائمة الانتظار (كما في مثالنا). يمكننا استخدام حلقة بشكل فعال. إضافة رقم جديد إلى قائمة الانتظار وإسقاط أقدم واحد هو نفسه ببساطة استبدال أقدم عنصر في هذه الحلقة مع واحدة جديدة. داخليا، يمكننا مرة أخرى استخدام مجموعة من طول ثابت في تركيبة مع مؤشر الدورية. هذه هي الطريقة التي تبدو التعليمات البرمجية في جافا. أولا، Let39s إنشاء واجهة قائمة الانتظار الخاصة بنا: هذه الواجهة تنحرف إلى حد ما عن تلك المقدمة في مكتبات جافا ولكن هذا غير مهم في الوقت الراهن. بعد ذلك، تنفيذ قائمة الانتظار لدينا: قائمة انتظار قائمة الانتظار من خلال الحلبة. إضافة عنصر جديد على رأس قائمة الانتظار تلقائيا إزالة أقدم عنصر في قائمة الانتظار - لا نسخ مصفوفات أو إعادة تعيين مراجع كائن المطلوبة. على عكس القوائم المرتبطة يمكننا الوصول في الواقع كل عنصر في الحلبة مباشرة مع طريقة الحصول على. وأخيرا، يمكننا إنشاء فئة فرعية من كائن طابور لدينا والتي سوف تتدخل كريمة كما يتم إضافة القيم الجديدة في الطابور. يمكننا استخدام الطبقة الآن. يتم تحديد طول المتوسط المتحرك في البداية من خلال طول المصفوفة المقدمة إلى منشئها. أحتاج إلى تتبع آخر 7 أيام عمل في حلقة قراءة ملف مسطح. يتم استخدامها لقياس التعب من قوائم العمل. الآن لدي شيء يعمل، ولكن يبدو مطول نوعا ما و إم غير متأكد ما إذا كان هناك نمط أن أكثر وضوحا. حاليا، لدي فئة جافا مع صفيف ثابت لعقد البيانات x أيام الماضية، ثم كما قرأت من خلال الملف، أنا ختم العنصر الأول ونقل 6 أخرى (لمدة أسبوع المتداول) مرة أخرى. تتم معالجة هذه المصفوفة الثابتة في أسلوبها الخاص أي. سؤالي: هل هذا هو نهج تصميم معقول، أو هل هناك شيء واضح بشكل واضح وبسيط للقيام بهذه المهمة شكرا رفاق طلب أغسطس 30 11 في 14:33 شكرا الكثير من الرجال: I39ve حصلت على الرسالة: استخدام كائن على مستوى عال واستغلال الطرق ذات الصلة أو العازلة دائرية. إجابات عظيمة، كل منهم. عندما تفكر في ذلك، كنت دائما بحاجة إلى الوصول إلى مجموعة كاملة حتى تتمكن من التخلص من هذا الإدخال الأول - الذي كنت wasn39t 100 متأكد من بلدي. I39m بالارتياح بأنني hadn39t غاب عن 1 بطانة وكان أساسا على معقول، إن لم يكن كفاءة وتتبع المسار هذا هو ما أحب حول هذا الموقع: ذات جودة عالية، والأجوبة ذات الصلة من الناس الذين يعرفون شت بهم. نداش Pete855217 30 أغسطس 11 في 15:05 لماذا يتم التهيئة الأولية الجري الإجمالي إلى نول ما هو نوعه حيث يتم الإعلان أنه سيكون جيدا إذا وضعت بعض عينات التعليمات البرمجية التي تشبه رمز جافا الفعلي. الانتقال، النقد بلدي سيكون ما يلي: وظيفتك لا أكثر من اللازم. يجب أن تكون الدالة أو الطريقة متماسكة. ومن الأنسب أن يفعلوا شيئا واحدا وشيئا واحدا فقط. والأسوأ من ذلك، ما يحدث في حلقة الخاص بك عندما x 5 يمكنك نسخ تشغيلTotal6 في تشغيل إجمالي 5. ولكن بعد ذلك لديك نسختين من نفس القيمة في موقف 5 و 6. في التصميم الخاص بك، وظيفة موفسوفلز العناصر الموجودة في صفيف الخاص بك بحساب الاشياء يطبع الإجمالي إلى خطأ قياسي إرجاع المجموع فإنه لا أكثر من اللازم. اقتراحي الأول ليس نقل الأشياء في المصفوفة. بدلا من ذلك، تنفيذ المخزن المؤقت دائري واستخدامه بدلا من الصفيف. فإنه سيتم تبسيط التصميم الخاص بك. اقتراحي الثاني هو تقسيم الأمور إلى وظائف متماسكة: لديها بنية بيانات (المخزن المؤقت الدائري) تسمح لك بالإضافة إليها (والتي تسقط أقدم إدخال كلما وصلت إلى قدرتها). إنتيراتور ديك وظيفة التي تحسب المجموع على التكرار (كنت لا تهتم إذا كنت حساب المجموع من مصفوفة، قائمة أو دائري بوفر.) لا يطلق عليه المجموع. استدعاء المبلغ، وهو ما كنت الحوسبة. هذا ما معرف تفعل :) that39s معلومات كبيرة لويس، ولكن تذكر هذه الوظيفة هو جزء صغير من وظائف الطبقة، وسيكون من المبالغة لإضافة الكثير من التعليمات البرمجية لجعلها مثالية. كنت صحيحا من الناحية الفنية، وأنا أفهم رمز بلدي لا 39too much39 ولكن في نفس الوقت أحيانا it39s أفضل أن يخطئ على جانب أصغر، رمز أكثر وضوحا من الذهاب للكمال. نظرا لمهارات جافا، حتى جعل الكود الكاذب الذي تصفه تجميع سيكون لي ضربة ميزانيتي على هذا ()، ولكن شكرا لوصف واضح. نداش Pete855217 31 أغسطس 11 في 02:23 همم، it39s ليس عن الكمال، ولكن عن الممارسات الصناعية المعمول بها التي نعرفها على مدى 3 عقود الماضية. التعليمات البرمجية النظيفة هي دائما واحدة التي يتم تقسيمها. لدينا عقود من الأدلة تشير إلى أن هذا هو الطريق للذهاب في الحالة العامة (من حيث الكفاءة من حيث التكلفة، والحد من العيب، والفهم، وما إلى ذلك). إلا إذا كان رمي بعيدا رمز لنوع لمرة واحدة من الشيء. ليس من المكلف أبدا القيام بذلك عندما يبدأ المرء أي تحليل المشكلة بهذه الطريقة. ترميز 101، وكسر المشكلة ويتبع التعليمات البرمجية، لا مبالغة ولا صعبة) نداش luis. espinal 31 أغسطس 11 في 15:55 مهمتك بسيطة جدا و أبروتش كنت قد اعتمدت هو بالتأكيد جيدة لهذا المنصب. ومع ذلك، إذا كنت ترغب في استخدام تصميم أفضل، يجب التخلص من كل هذا العدد حركة يمكنك استخدام أفضل طابور فيفو والاستفادة من وسائل الدفع والبوب على نحو جيد الطريقة التي رمز لن تعكس أي حركة البيانات، فقط المنطقين الإجراءات من البيانات الجديدة وإزالة البيانات أقدم من 7 أيام. أجابيد أوج 30 11 في 14:49
No comments:
Post a Comment