Java เฉลี่ยเคลื่อนที่ คิว


ฉันจำเป็นต้องติดตาม 7 วันทำการล่าสุดในการอ่านไฟล์แบบแบน ถูกใช้ในการวัดความเมื่อยล้าของ rosters งาน ตอนนี้ฉันมีบางสิ่งบางอย่างที่ใช้ได้ แต่ดูเหมือนว่าค่อนข้าง verbose และ Im ไม่แน่ใจว่า theres รูปแบบที่กระชับมากขึ้น ขณะนี้ฉันมีคลาส Java ที่มีอาร์เรย์แบบคงที่ในการเก็บข้อมูล x วันล่าสุดจากนั้นเมื่ออ่านไฟล์ฉันจะตัดองค์ประกอบแรกและย้ายอีก 6 รายการ (รวมเป็นสัปดาห์โดยรวม) กลับมาทีละหนึ่ง การประมวลผลของอาร์เรย์แบบคงที่นี้จะกระทำในรูปแบบของตัวเองเช่น คำถามของฉัน: นี่คือวิธีการออกแบบที่เหมาะสมหรือมีบางอย่างที่เห็นได้ชัด blindingly และง่ายที่จะทำสิ่งนี้ขอบคุณ guys ถามสิงหาคม 30 11 ที่ 14:33 ขอบคุณคนมาก: Iveve ข้อความ: ใช้วัตถุที่ระดับสูงกว่าและใช้ประโยชน์จาก วิธีการที่เกี่ยวข้องหรือบัฟเฟอร์วงกลม คำตอบที่ดีทั้งหมดของพวกเขา เมื่อคุณคิดถึงเรื่องนี้คุณจะต้องเข้าถึงอาร์เรย์ทั้งหมดเพื่อที่คุณจะได้สามารถกำจัดรายการแรกซึ่งฉันไม่แน่ใจว่าจะเป็นของตัวเองได้ 100 รายการ I'm โล่งใจที่ฉัน hadn39t พลาดบาง 1 ซับและเป็นพื้นที่เหมาะสมหากไม่ได้มีประสิทธิภาพและสั้นติดตามนี่คือสิ่งที่ฉันรักเกี่ยวกับเว็บไซต์นี้: ที่มีคุณภาพสูงคำตอบที่เกี่ยวข้องจากผู้ที่รู้ SHT ของพวกเขา ndash Pete855217 Aug 30 11 at 15:05 ทำไมคุณถึงเริ่มต้นใช้งาน Total to null สิ่งที่เป็นชนิดของมันประกาศว่าจะทำอย่างไรดีถ้าคุณใส่โค้ดตัวอย่างที่คล้ายกับโค้ด Java จริง การวิจารณ์คำติชมของฉันจะเป็นดังนี้: งานของคุณทำมากเกินไป ฟังก์ชั่นหรือวิธีการควรจะเหนียว เหมาะสมมากขึ้นควรทำสิ่งหนึ่งสิ่งเดียวเท่านั้น ยิ่งแย่ลงสิ่งที่เกิดขึ้นในห่วงของคุณเมื่อ x 5 คุณคัดลอกรันTotal6เข้าสู่รัน Total5 แต่แล้วคุณมีสองชุดของค่าเดียวกันที่ตำแหน่ง 5 และ 6 ในการออกแบบของคุณ movesshuffles ฟังก์ชันของคุณรายการในอาร์เรย์ของคุณคำนวณจำนวนพิมพ์สิ่งที่ผิดพลาดมาตรฐานส่งกลับทั้งหมดมันไม่มากเกินไป ข้อเสนอแนะครั้งแรกของฉันไม่ใช่การย้ายเนื้อหารอบ ๆ แทนที่จะใช้บัฟเฟอร์แบบวงกลมและใช้แทนอาร์เรย์ จะทำให้การออกแบบของคุณง่ายขึ้น ข้อเสนอแนะที่สองของฉันคือการทำลายสิ่งต่างๆลงในหน้าที่ที่เหนียวแน่น: มีโครงสร้างข้อมูล (บัฟเฟอร์วงกลม) ที่ช่วยให้คุณสามารถเพิ่มลงไปได้ (และจะลบรายการที่เก่าที่สุดเมื่อใดก็ตามที่เข้าถึงความจุของมัน) มีโครงสร้างข้อมูลที่ใช้ interator มีฟังก์ชันที่คำนวณจำนวนรวมของ iterator (คุณไม่สนใจถ้าคุณกำลังคำนวณจำนวนรวมของอาร์เรย์รายการหรือ bufer แบบวงกลม) อย่าเรียกว่า total เรียกว่าผลรวมซึ่งเป็นสิ่งที่คุณกำลังคำนวณ Thats สิ่งที่ Id ทำ :) ที่ Luis ข้อมูลที่ดี แต่จำฟังก์ชันนี้เป็นส่วนเล็ก ๆ ของการทำงานของชั้นเรียนและมันจะ overkill เพิ่มรหัสมากเกินไปเพื่อให้สมบูรณ์แบบ คุณมีความถูกต้องทางเทคนิคและฉันเข้าใจรหัสของฉันไม่ 39too มาก [39] แต่ในเวลาเดียวกันบางครั้งก็ดีกว่าที่จะผิดพลาดในด้านของขนาดเล็กรหัสที่ชัดเจนกว่าไปเพื่อความสมบูรณ์แบบ ให้ทักษะ Java ของฉันแม้ทำให้ pseudocode ที่คุณอธิบายคอมไพล์จะให้ฉันเป่างบประมาณของฉันในนี้ () แต่ขอขอบคุณสำหรับคำอธิบายที่ชัดเจน ndash Pete855217 Aug 31 11 at 2:23 Hmmm ไม่เกี่ยวกับความสมบูรณ์แบบ แต่เกี่ยวกับการปฏิบัติอุตสาหกรรมที่เป็นที่ยอมรับที่เราได้ทราบมาแล้วในช่วง 3 ทศวรรษที่ผ่านมา รหัสทำความสะอาดคือส่วนที่ถูกแบ่งพาร์ติชันเสมอ เรามีหลักฐานหลายสิบปีที่ชี้ให้เห็นว่านี่คือวิธีที่จะไปในกรณีทั่วไป (ในเรื่องของต้นทุน - ประสิทธิภาพการลดข้อบกพร่องความเข้าใจ ฯลฯ ) เว้นเสียแต่ว่าจะเป็นรหัสทิ้งสำหรับสิ่งที่ทำเพียงครั้งเดียว ไม่ต้องเสียค่าใช้จ่ายเมื่อทำเช่นนี้เมื่อเริ่มวิเคราะห์ปัญหาในลักษณะนี้ รหัส 101 ทำลายปัญหาและรหัสต่อไปนี้ไม่ overkill หรือยาก) ndash luis. espinal Aug 31 11 at 15:55 งานของคุณง่ายเกินไปและ aproach คุณได้นำแน่นอนดีสำหรับงาน อย่างไรก็ตามถ้าคุณต้องการใช้การออกแบบที่ดีกว่าคุณต้องกำจัดการเคลื่อนไหวจำนวนทั้งหมดที่คุณใช้คิว FIFO และใช้ประโยชน์จากวิธีการแบบพุชและป๊อปซึ่งวิธีนี้จะไม่สะท้อนการเคลื่อนไหวข้อมูลใด ๆ ของข้อมูลใหม่และลบข้อมูลที่มีอายุมากกว่า 7 วัน ตอบ Aug 30 11 at 14: 49 ฉันมีโปรแกรม datalogging ทางวิทยาศาสตร์ที่ฉันได้รับการพัฒนาเป็นเวลาหลายปีแล้ว ขณะนี้เราจำเป็นต้องเพิ่มฟังก์ชันการทำงานบางอย่างเพื่อให้ค่าเฉลี่ยเคลื่อนที่ของข้อมูลที่รวบรวมอยู่ ฉันสามารถสร้างคิวของ myDataClass ทำบัฟเฟอร์ FIFO แต่ฉันสงสัยว่าวิธีที่ดีที่สุดในการทำค่าเฉลี่ยอาจเป็นอย่างไร ดังที่คุณเห็นจากตัวอย่างโค้ดด้านล่าง myDataClass มีโครงสร้างข้อมูลหลายแบบซึ่งสามารถคำนวณได้โดยเฉลี่ยและบางส่วนไม่สามารถ (เช่นสตริง) คำถามหลักคือว่ามีวิธีง่ายๆในการบรรลุนี้หรือฉันต้องเขียนโค้ดเฉลี่ยแต่ละรายการภายใน myDataClass หรือควรจะออกแบบ myDataClass ขอบคุณ วันอังคารที่ 12 กรกฎาคม 2554 เวลา 9:14 น. Personnaly ฉันจะสร้าง ClassDataQueue (ของ MyDataClass) ที่ dequeue ตัวเองถ้านับในคิวผ่าน 10 รายการ ด้วยวิธีนี้คุณจะไม่ต้องดูแลหมายเลขของรายการในคิวจากโค้ดของคุณซึ่งจะเป็นการดูแลจากภายในชั้นคิวคะแนนเป็นคำตอบโดย Mike Feng วันพุธที่ 20 กรกฎาคม 2011 เวลา 01:56 น. เมื่อวันอังคารที่ 12 กรกฎาคม 2554 เวลา 9:40 น. หลังจากสอบสวนเล็กน้อยแล้วฉันคิดว่าฉันพบคำตอบสำหรับคุณ คุณสามารถใช้วิธี CopyTo เพื่อคัดลอกรายการที่เหลือในคิวไปยังอาร์เรย์ โปรดทราบว่าฉันไม่ได้คำนวณค่าเฉลี่ยฉันแสดงให้เห็นว่าคุณจะได้รับการคำนวณของคุณเพียงใด แต่นั่นเป็นเพียงการเพิ่มการคำนวณของคุณเองตามกฎทางธุรกิจของคุณเท่านั้น ทำเครื่องหมายว่าตอบโดย Mike Feng วันพุธที่ 20 กรกฎาคม 2011 เวลา 17:56 น. วันศุกร์ที่ 15 กรกฎาคม 2554 เวลา 5:16 น. ตามความเข้าใจของฉันความต้องการของคุณมีลักษณะดังนี้: นี่คือข้อมูลในคิว: myDataClass1 datadbl 2.1 datastr quotsomeString1quot dataarraydbl อาร์เรย์คู่ myDataClass2 datadbl 3.5 datastr quotsomeString2quot dataarraydbl อาร์เรย์คู่ myDataClass10 datadbl 9.1 datastr quotsomeString10quot dataarraydbl double array ตอนนี้คุณต้องการคำนวณจำนวนเฉลี่ยของ datadbl feild ในแต่ละอ็อบเจ็กต์ myDataClass และได้รับค่าเฉลี่ยของ dataarraydbl feild ถ้าเป็นเช่นนั้นฉันจะแนะนำให้คุณทำสิ่งเดียวกับที่ Crazypenie แนะนำ: สร้างคลาสใหม่ชื่อว่า DataQueue: ฉันหวังว่าข้อมูลนี้จะเป็นประโยชน์ถ้าฉันเข้าใจผิดอะไรอยู่โปรดแจ้งให้เราทราบ Mike Feng MSFT ความช่วยเหลือจากชุมชน MSDN การตอบรับสำหรับเรารับหรือขอรหัสตัวอย่างจาก Microsoft โปรดอย่าลืมทำเครื่องหมายคำตอบเป็นคำตอบหากพวกเขาช่วยและยกเลิกการทำเครื่องหมายหากพวกเขาไม่ได้ให้ความช่วยเหลือ ทำเครื่องหมายว่าตอบโดย Mike Feng ผู้ดูแลวันพุธที่ 20 กรกฎาคม 2011 เวลา 15.55 น. วันศุกร์ที่ 15 กรกฎาคม 2011 เวลา 03:33 น. ขอบคุณ Cor คุณสามารถทำแบบนั้นได้ แต่ myDataClass มีขนาดค่อนข้างใหญ่และระบบบันทึกข้อมูลสามารถทำงานได้ เป็นเวลานานดังนั้นจึงมีประสิทธิภาพมากขึ้นสำหรับฉันที่จะสำเนาขยะของชั้น I dont จริงต้องใช้สำหรับการคำนวณค่าเฉลี่ย คิวดูเหมือนวิธีที่ง่ายที่สุดเพื่อให้บรรลุนี้ คำถามหลักของฉันแม้ว่าจะเป็นอย่างไรเฉลี่ยชั้นเช่นนี้ฉันรู้สึกว่าฉันจะต้องเขียนรหัสที่ไม่ได้เฉพาะสำหรับแต่ละประเภทข้อมูลใน myDataClass. ชั้นสาธารณะ myDataClass อังคาร, 12 กรกฎาคม 2011 10:40 น. ตามความเข้าใจของฉันความต้องการของคุณเป็นอย่างนี้: นี่คือข้อมูลในคิว: myDataClass1 datadbl 2.1 datastr quotsomeString1quot dataarraydbl อาร์เรย์คู่ myDataClass2 datadbl 3.5 datastr quotsomeString2quot dataarraydbl อาร์เรย์คู่ myDataClass10 datadbl 9.1 datastr quotsomeString10quot dataarraydbl double array ตอนนี้คุณต้องการคำนวณจำนวนเฉลี่ยของ datadbl feild ในแต่ละอ็อบเจ็กต์ myDataClass และได้รับค่าเฉลี่ยของ dataarraydbl feild ถ้าเป็นเช่นนั้นฉันจะแนะนำให้คุณทำสิ่งเดียวกับที่ Crazypenie แนะนำ: สร้างคลาสใหม่ชื่อว่า DataQueue: ฉันหวังว่าข้อมูลนี้จะเป็นประโยชน์ถ้าฉันเข้าใจผิดอะไรอยู่โปรดแจ้งให้เราทราบ Mike Feng MSFT ความช่วยเหลือจากชุมชน MSDN การตอบรับสำหรับเรารับหรือขอรหัสตัวอย่างจาก Microsoft โปรดจำไว้ว่าให้ทำเครื่องหมายคำตอบเป็นคำตอบหากพวกเขาช่วยและยกเลิกการทำเครื่องหมายหากพวกเขาไม่ได้ให้ความช่วยเหลือ ทำเครื่องหมายว่าคำตอบโดย Mike Feng วันพุธที่ 20 กรกฎาคม 2011 เวลา 15.55 น. วันศุกร์ที่ 15 กรกฏาคม 2011 เวลา 3:33 น. AMgetMaxQueueLength ส่งคืนจำนวนสูงสุดของ tuples ที่คิวนี้เคยเห็น ส่งกลับ: จำนวนสูงสุดของคิวรีที่คิวนี้สามารถมี getCurrentQueueLength ส่งคืนจำนวนโดยประมาณของคิวปัดที่อยู่ในคิวนี้ จำนวนนี้เป็นค่าประมาณเนื่องจากอาจมีหลายเธรดเข้าถึงคิวในเวลาเดียวกัน ส่งกลับ: จำนวนโดยประมาณของ tuples ปัจจุบันในคิว getBatchProcessingTime คืนค่าเฉลี่ยเคลื่อนที่ของระยะเวลา (microseconds) ที่ใช้ในการประมวลผลชุดของ tuples ผลตอบแทน: จำนวนเวลา (ไมครอน) ที่ใช้ในการประมวลผลชุดของ tuples เนื่องจาก: 6.3.10 getBatchLatency ส่งกลับค่าเฉลี่ยเคลื่อนที่ของเวลา (microseconds) สำหรับชุดของ tuples เพื่อข้ามคิวการส่งคืน: จำนวนเวลา (microseconds) สำหรับชุดของ tuples เพื่อข้ามคิวตั้งแต่: 6.3.10 getBatchSize ส่งกลับค่าเฉลี่ยเคลื่อนที่ของขนาดของชุดของ tuples Returns: ส่งกลับค่าเฉลี่ยเคลื่อนที่ของขนาดของชุดของ tuples เนื่องจาก: 6.6.13 ส่งคืนชื่อของ คิวนี้ สำหรับคิวระหว่างโมดูลชื่อจะเป็นชื่อของสตรีมที่กำลังถูกรวมเข้าไว้ สำหรับคิวระหว่างคอนเทนเนอร์ชื่อจะเป็นชื่อของการเชื่อมต่อคอนเทนเนอร์รุ่นนี้ง่ายกว่ามาก: public class MovingAverageInSlidingWIndow int windowsize Queue int sum สาธารณะ MovingAverageInSlidingWIndow (int windowsize) this. windowsize windowsize this. queue ใหม่ LinkedList () this. sum 0 พบค่าเฉลี่ยเคลื่อนที่หลังจากใส่รายการ n ลงในสตรีมข้อมูลสองครั้ง findMovingAverage (int n) if (queue. size () gt windowsize - 1) sum sum - queue. poll () queue. offer (n) sum sum n return (double) () () () () หลังจากที่เพิ่มคิวฉันไปที่คิว: ค่าเฉลี่ย () ค่าที่เป็นค่าคงที่ คือ m. findMovingAverage (i)) เราสามารถเก็บผลรวมขององค์ประกอบในคิวในตัวแปรส่วนกลางได้ ดังนั้นการลดการคำนวณในวิธีการต่อไป () public class MovingAverage LinkedList คิว int ขนาด int sum 0 ถือสรุปคิวเริ่มต้นโครงสร้างข้อมูลของคุณที่นี่ สาธารณะขนาด () ขนาด public. File (int) this. queue new LinkedList () this. size size สาธารณะคู่ถัดไป (int val) queue. offer (val) รวม val ถ้า (queue. size () gtthis. size) sum - queue. poll ()

Comments