JavaRush /จาวาบล็อก /Random-TH /ตัวเลือกสำหรับการแก้ปัญหาระดับ 19 งาน 16 (ติดตามการเปลี่ย...
Anton Stezhkin
ระดับ

ตัวเลือกสำหรับการแก้ปัญหาระดับ 19 งาน 16 (ติดตามการเปลี่ยนแปลง)

เผยแพร่ในกลุ่ม

พื้นหลัง:

ฉันแก้ไขปัญหานี้มาเป็น เวลานานมาก จำเป็นต้องเปรียบเทียบไฟล์ 2 เวอร์ชันและค้นหาการเปลี่ยนแปลง ฉันตัดสินใจแยกเนื้อหาของไฟล์ในรูปแบบของอาร์เรย์และเปรียบเทียบอาร์เรย์ จากนั้นฉันก็โง่อยู่นานและทำผิดพลาดและสุดท้ายฉันก็วาดอาร์เรย์บนกระดาษในกล่อง จริงๆ แล้วก่อนหน้านี้ฉันดูวิธีแก้ไขปัญหาอื่น แต่มันซับซ้อนมากจนฉันไม่สามารถควบคุมมันได้ :) นอกจากนี้ ยังมีอัลกอริธึมที่แตกต่างกัน 2 แบบในกรณีที่ไฟล์เก่ายาวกว่าและไฟล์ใหม่ยาวกว่า ฉันไม่ชอบมัน.

ส่วนสำคัญของโซลูชันของฉัน:

มี 2 ​​อาร์เรย์ที่เหมือนกัน ตลอดทั้งข้อความ ฉันจะเรียกพวกมันว่า "อาร์เรย์ใหม่" และ "อาร์เรย์เก่า" และสามารถแทรกองค์ประกอบใหม่ลงในแต่ละองค์ประกอบได้ เหล่านั้น. อาร์เรย์อ้างอิงถือเป็นอาร์เรย์ที่สอดคล้องกับเนื้อหาของไฟล์เก่าที่มีการลบทั้งหมด เนื้อหาของไฟล์เก่าและใหม่ถือเป็นข้อมูลอ้างอิงพร้อมส่วนแทรก เราดูทั้งสองอาร์เรย์ (เนื้อหาของเก่าและใหม่) แบบวนซ้ำ และหากเราตรวจพบการแทรกในหนึ่งในนั้น เราจะข้ามขั้นตอนหนึ่งเพื่อให้องค์ประกอบเดียวกันของอาร์เรย์ที่เปรียบเทียบกลับมาอยู่ใกล้ๆ อีกครั้ง

อัลกอริทึม:

ตัวแปร: i - ดัชนีของเซลล์อาร์เรย์ที่มีเนื้อหาของไฟล์ OLD nI - ดัชนีของเซลล์อาร์เรย์พร้อมเนื้อหาของไฟล์ NEW หากองค์ประกอบของอาร์เรย์แตกต่างกัน เราจะเขียนลงในตัวแปรชั่วคราว: oldMismatch - องค์ประกอบจากอาร์เรย์แบบเรียงซ้อน newMismatch - องค์ประกอบจากอาร์เรย์ใหม่ เมื่อวนซ้ำองค์ประกอบอาร์เรย์ ในกรณีต่อไปนี้เป็นไปได้:
  1. ตัวแปร oldMismatch และ newMismatch ว่างเปล่า องค์ประกอบในอาร์เรย์ทั้งสองจะเหมือนกัน เขียน Type.SAME ลงในรายการ ไปข้างหน้า.

  2. ตัวแปร oldMismatch และ newMismatch ว่างเปล่า องค์ประกอบในอาร์เรย์ทั้งสองไม่เหมือนกัน เราเขียนค่าจากอันเก่าเป็น oldMismatch จากอันใหม่เป็น newMismatch ไปข้างหน้า.

  3. ตัวแปร oldMismatch และ newMismatch จะไม่ว่างเปล่า เราเปรียบเทียบกับองค์ประกอบปัจจุบันของอาร์เรย์

    เรามาสรุปกัน เราเขียนสิ่งที่ค้นพบลงในรายการ (ตัวแปรบรรทัด) เราข้ามขั้นตอนการวนซ้ำสำหรับอาร์เรย์ตัวใดตัวหนึ่ง

    1. 3.1 oldMismatch เท่ากับองค์ประกอบปัจจุบันของอาร์เรย์ใหม่ ซึ่งหมายความว่ามีการเพิ่มบรรทัดลงในไฟล์

      ค่าของสตริงนี้ถูกเก็บไว้ใน newMismatch ลองเขียนมันลงไปแบบนั้น.

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));

      เนื่องจากมีองค์ประกอบเพิ่มเติมในอาร์เรย์ที่มีเนื้อหาของไฟล์ใหม่ คุณจึงต้องเลื่อนองค์ประกอบอาร์เรย์ 1 ใหม่ไปข้างหน้าโดยสัมพันธ์กับองค์ประกอบเก่า

      ดังนั้นอาร์เรย์ OLD จะข้าม 1 ขั้นตอนการวนซ้ำ

      ฉัน--;

    2. 3.2 newMismatch เท่ากับองค์ประกอบปัจจุบันของอาร์เรย์เก่า ซึ่งหมายความว่ามีการลบบรรทัดออกจากไฟล์ มาเขียนมันลงไปกันดีกว่า

      lines.add(new LineItem(Type.REMOVED, oldMismatch));
       lines.add(new LineItem(Type.SAME, newMismatch));

      มีองค์ประกอบเพิ่มเติมในอาร์เรย์ OLD ซึ่งหมายความว่าอาร์เรย์ NEW จะข้าม 1 ขั้นตอนการวนซ้ำ

      พรรณี--;

  4. กำลังประมวลผลจุดสิ้นสุดของอาร์เรย์ และตอนนี้เราก็มาถึงจุดสิ้นสุดของอาเรย์แบบเก่าแล้ว มีสถานการณ์ที่เป็นไปได้หลายประการ

    1. 4.1 - ArrayIndexOutOfBoundsException - อาร์เรย์ใหม่จะสั้นกว่าอาร์เรย์เก่า เราบันทึกว่าบรรทัดสุดท้ายของไฟล์ถูกลบไปแล้ว

    2. 4.2 - องค์ประกอบสุดท้ายของอาร์เรย์ใหม่ยังคงอยู่ ซึ่งไม่ครอบคลุมอยู่ในความสนใจของเรา เราบันทึกเป็นการเพิ่ม

    3. 4.3 - ตัวแปร oldMismatch และ newMismatch ไม่ว่างเปล่า เราเขียนลงไป:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS - อย่าลืมรีเซ็ตตัวแปรและติดตามตัวแปร nI
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION