บอกว่าฉันArray[Int]
ชอบ
val array = Array( 1, 2, 3 )
ตอนนี้ฉันต้องการต่อท้ายองค์ประกอบในอาร์เรย์พูดค่า4
ดังในตัวอย่างต่อไปนี้:
val array2 = array + 4 // will not compile
แน่นอนฉันสามารถใช้System.arraycopy()
และทำสิ่งนี้ได้ด้วยตัวเอง แต่ต้องมีฟังก์ชั่นไลบรารี Scala สำหรับสิ่งนี้ซึ่งฉันหาไม่พบ ขอบคุณสำหรับคำแนะนำ!
หมายเหตุ:
ฉันทราบว่าฉันสามารถต่อท้าย Array ขององค์ประกอบอื่นได้เช่นในบรรทัดต่อไปนี้ แต่ดูเหมือนจะกลมเกินไป:
val array2b = array ++ Array( 4 ) // this works
ฉันตระหนักถึงข้อดีและข้อเสียของ List vs Array และที่นี่ฉันมีเหตุผลหลายประการที่สนใจในการขยาย Array โดยเฉพาะ
แก้ไข 1
ขอบคุณสำหรับคำตอบที่ชี้ไปที่:+
วิธีการดำเนินการ นี่คือสิ่งที่ฉันกำลังมองหา น่าเสียดายที่มันค่อนข้างช้ากว่าการใช้งานเมธอด append () ที่กำหนดเองโดยใช้arraycopy
- ช้ากว่าประมาณสองถึงสามเท่า เมื่อมองไปที่การนำไปใช้งานSeqLike[]
ตัวสร้างจะถูกสร้างขึ้นจากนั้นอาร์เรย์จะถูกเพิ่มเข้าไปจากนั้นการผนวกจะดำเนินการผ่านตัวสร้างจากนั้นตัวสร้างจะแสดงผล ไม่ใช่การนำไปใช้งานที่ดีสำหรับอาร์เรย์ ฉันทำการเปรียบเทียบอย่างรวดเร็วโดยเปรียบเทียบทั้งสองวิธีโดยดูเวลาที่เร็วที่สุดจากสิบรอบ การทำซ้ำ 10 ล้านครั้งของรายการเดียวต่อท้ายอินสแตนซ์อาร์เรย์ 8 องค์ประกอบของบางคลาสFoo
ใช้เวลา 3.1 วินาที:+
และ 1.7 วินาทีด้วยappend()
วิธีการง่ายๆที่ใช้System.arraycopy();
การทำซ้ำ 10 ล้านรายการต่อท้ายบนอาร์เรย์ 8 องค์ประกอบของ Long ใช้เวลา 2.1 วินาที:+
และ 0.78 วินาทีด้วยappend()
วิธีง่ายๆ สงสัยว่าสิ่งนี้ไม่สามารถแก้ไขได้ในไลบรารีด้วยการใช้งานแบบกำหนดเองสำหรับArray
?
แก้ไข 2
สำหรับสิ่งที่คุ้มค่าฉันยื่นตั๋ว: https://issues.scala-lang.org/browse/SI-5017
System.arraycopy(...)
ถูกแทนที่ด้วยArray.copy(...)
ArrayBuffer
ที่แปลงหลังจากผนวกสุดท้ายกับอาร์เรย์ (ด้วยtoArray
) ได้หรือไม่?
ArrayBuffer
และ+=
วิธีการ? ที่จะให้คุณตัดจำหน่าย O (1) ต่อท้าย