พื้นหลัง:
ฉันแก้ไขปัญหานี้มาเป็น เวลานานมาก จำเป็นต้องเปรียบเทียบไฟล์ 2 เวอร์ชันและค้นหาการเปลี่ยนแปลง ฉันตัดสินใจแยกเนื้อหาของไฟล์ในรูปแบบของอาร์เรย์และเปรียบเทียบอาร์เรย์ จากนั้นฉันก็โง่อยู่นานและทำผิดพลาดและสุดท้ายฉันก็วาดอาร์เรย์บนกระดาษในกล่อง จริงๆ แล้วก่อนหน้านี้ฉันดูวิธีแก้ไขปัญหาอื่น แต่มันซับซ้อนมากจนฉันไม่สามารถควบคุมมันได้ :) นอกจากนี้ ยังมีอัลกอริธึมที่แตกต่างกัน 2 แบบในกรณีที่ไฟล์เก่ายาวกว่าและไฟล์ใหม่ยาวกว่า ฉันไม่ชอบมัน.ส่วนสำคัญของโซลูชันของฉัน:
มี 2 อาร์เรย์ที่เหมือนกัน ตลอดทั้งข้อความ ฉันจะเรียกพวกมันว่า "อาร์เรย์ใหม่" และ "อาร์เรย์เก่า" และสามารถแทรกองค์ประกอบใหม่ลงในแต่ละองค์ประกอบได้ เหล่านั้น. อาร์เรย์อ้างอิงถือเป็นอาร์เรย์ที่สอดคล้องกับเนื้อหาของไฟล์เก่าที่มีการลบทั้งหมด เนื้อหาของไฟล์เก่าและใหม่ถือเป็นข้อมูลอ้างอิงพร้อมส่วนแทรก เราดูทั้งสองอาร์เรย์ (เนื้อหาของเก่าและใหม่) แบบวนซ้ำ และหากเราตรวจพบการแทรกในหนึ่งในนั้น เราจะข้ามขั้นตอนหนึ่งเพื่อให้องค์ประกอบเดียวกันของอาร์เรย์ที่เปรียบเทียบกลับมาอยู่ใกล้ๆ อีกครั้งอัลกอริทึม:
ตัวแปร: i - ดัชนีของเซลล์อาร์เรย์ที่มีเนื้อหาของไฟล์ OLD nI - ดัชนีของเซลล์อาร์เรย์พร้อมเนื้อหาของไฟล์ NEW หากองค์ประกอบของอาร์เรย์แตกต่างกัน เราจะเขียนลงในตัวแปรชั่วคราว: oldMismatch - องค์ประกอบจากอาร์เรย์แบบเรียงซ้อน newMismatch - องค์ประกอบจากอาร์เรย์ใหม่ เมื่อวนซ้ำองค์ประกอบอาร์เรย์ ในกรณีต่อไปนี้เป็นไปได้:-
ตัวแปร oldMismatch และ newMismatch ว่างเปล่า องค์ประกอบในอาร์เรย์ทั้งสองจะเหมือนกัน เขียน Type.SAME ลงในรายการ ไปข้างหน้า.
-
ตัวแปร oldMismatch และ newMismatch ว่างเปล่า องค์ประกอบในอาร์เรย์ทั้งสองไม่เหมือนกัน เราเขียนค่าจากอันเก่าเป็น oldMismatch จากอันใหม่เป็น newMismatch ไปข้างหน้า.
-
ตัวแปร oldMismatch และ newMismatch จะไม่ว่างเปล่า เราเปรียบเทียบกับองค์ประกอบปัจจุบันของอาร์เรย์
เรามาสรุปกัน เราเขียนสิ่งที่ค้นพบลงในรายการ (ตัวแปรบรรทัด) เราข้ามขั้นตอนการวนซ้ำสำหรับอาร์เรย์ตัวใดตัวหนึ่ง
-
3.1 oldMismatch เท่ากับองค์ประกอบปัจจุบันของอาร์เรย์ใหม่ ซึ่งหมายความว่ามีการเพิ่มบรรทัดลงในไฟล์
ค่าของสตริงนี้ถูกเก็บไว้ใน newMismatch ลองเขียนมันลงไปแบบนั้น.
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
เนื่องจากมีองค์ประกอบเพิ่มเติมในอาร์เรย์ที่มีเนื้อหาของไฟล์ใหม่ คุณจึงต้องเลื่อนองค์ประกอบอาร์เรย์ 1 ใหม่ไปข้างหน้าโดยสัมพันธ์กับองค์ประกอบเก่า
ดังนั้นอาร์เรย์ OLD จะข้าม 1 ขั้นตอนการวนซ้ำ
ฉัน--;
-
3.2 newMismatch เท่ากับองค์ประกอบปัจจุบันของอาร์เรย์เก่า ซึ่งหมายความว่ามีการลบบรรทัดออกจากไฟล์ มาเขียนมันลงไปกันดีกว่า
lines.add(new LineItem(Type.REMOVED, oldMismatch)); lines.add(new LineItem(Type.SAME, newMismatch));
มีองค์ประกอบเพิ่มเติมในอาร์เรย์ OLD ซึ่งหมายความว่าอาร์เรย์ NEW จะข้าม 1 ขั้นตอนการวนซ้ำ
พรรณี--;
-
-
กำลังประมวลผลจุดสิ้นสุดของอาร์เรย์ และตอนนี้เราก็มาถึงจุดสิ้นสุดของอาเรย์แบบเก่าแล้ว มีสถานการณ์ที่เป็นไปได้หลายประการ
-
4.1 - ArrayIndexOutOfBoundsException - อาร์เรย์ใหม่จะสั้นกว่าอาร์เรย์เก่า เราบันทึกว่าบรรทัดสุดท้ายของไฟล์ถูกลบไปแล้ว
-
4.2 - องค์ประกอบสุดท้ายของอาร์เรย์ใหม่ยังคงอยู่ ซึ่งไม่ครอบคลุมอยู่ในความสนใจของเรา เราบันทึกเป็นการเพิ่ม
-
4.3 - ตัวแปร oldMismatch และ newMismatch ไม่ว่างเปล่า เราเขียนลงไป:
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
-
GO TO FULL VERSION