ฉันมีสตริงอาร์เรย์ ( String[]) และฉันต้องการลบรายการแรก ฉันจะทำอย่างมีประสิทธิภาพได้อย่างไร?
ฉันมีสตริงอาร์เรย์ ( String[]) และฉันต้องการลบรายการแรก ฉันจะทำอย่างมีประสิทธิภาพได้อย่างไร?
คำตอบ:
ไม่สามารถเปลี่ยนขนาดของอาร์เรย์ใน Java ได้ ดังนั้นในทางเทคนิคแล้วคุณไม่สามารถลบองค์ประกอบใด ๆ ออกจากอาร์เรย์ได้
วิธีหนึ่งในการจำลองการลบองค์ประกอบออกจากอาร์เรย์คือการสร้างอาร์เรย์ใหม่ที่เล็กลงจากนั้นคัดลอกองค์ประกอบทั้งหมดจากอาร์เรย์เดิมไปยังอาร์เรย์ใหม่ที่มีขนาดเล็กลง
String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);
อย่างไรก็ตามฉันจะไม่แนะนำวิธีการข้างต้น คุณควรใช้ไฟล์List<String>. รายการช่วยให้คุณสามารถเพิ่มและลบรายการจากดัชนีใดก็ได้ ซึ่งจะมีลักษณะคล้ายกับสิ่งต่อไปนี้:
List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
ArrayListis O (n)
ArrayListแต่ไม่ใช่สำหรับLinkedList.
Arrays.copyOfRange()สำหรับ API9 +
วิธีที่ง่ายที่สุดอาจเป็นดังนี้ - โดยพื้นฐานแล้วคุณต้องสร้างอาร์เรย์ใหม่ที่มีขนาดเล็กกว่าหนึ่งองค์ประกอบจากนั้นคัดลอกองค์ประกอบที่คุณต้องการเก็บไว้ในตำแหน่งที่ถูกต้อง
int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
โปรดทราบว่าหากคุณพบว่าตัวเองดำเนินการประเภทนี้บ่อยๆอาจเป็นสัญญาณว่าคุณควรใช้โครงสร้างข้อมูลประเภทอื่นเช่นรายการที่เชื่อมโยง การสร้างอาร์เรย์ใหม่ทุกครั้งเป็นการดำเนินการ O (n) ซึ่งอาจมีราคาแพงหากอาร์เรย์ของคุณมีขนาดใหญ่ รายการที่เชื่อมโยงจะทำให้คุณสามารถลบ O (1) ขององค์ประกอบแรกได้
อีกทางเลือกหนึ่งคืออย่าลบรายการแรกออกเลย แต่เพียงแค่เพิ่มจำนวนเต็มที่ชี้ไปยังดัชนีแรกที่ใช้อยู่ ผู้ใช้อาร์เรย์จะต้องคำนึงถึงการชดเชยนี้ แต่อาจเป็นแนวทางที่มีประสิทธิภาพ คลาส Java String ใช้วิธีนี้ภายในเมื่อสร้างสตริงย่อย
Arrays.copyOfRange()คือ.
ทำไม่ได้เลยนับประสาอะไรกับเร็ว ๆ นี้ อาร์เรย์ใน Java มีขนาดคงที่ สองสิ่งที่คุณทำได้คือ:
คุณสามารถใช้System.arraycopyสำหรับสิ่งเหล่านี้ ทั้งสองนี้คือ O (n) เนื่องจากคัดลอกทั้งหมดยกเว้น 1 องค์ประกอบ
หากคุณจะลบองค์ประกอบแรกบ่อยๆให้ลองใช้LinkedListแทน คุณสามารถใช้LinkedList.removeซึ่งมาจากQueueอินเทอร์เฟซเพื่อความสะดวก ด้วยLinkedListการลบองค์ประกอบแรกคือ O (1) ในความเป็นจริงการลบองค์ประกอบใด ๆ คือ O (1) เมื่อคุณListIteratorไปถึงตำแหน่งนั้นแล้ว อย่างไรก็ตามการเข้าถึงองค์ประกอบโดยพลการโดยดัชนีคือ O (n)
เก็บดัชนีขององค์ประกอบ "สด" แรกของอาร์เรย์ การลบ (แกล้งทำเป็นลบ) องค์ประกอบแรกจะกลายเป็นการO(1)ดำเนินการที่มีความซับซ้อนของเวลา
สรุปวิธีการเชื่อมโยงอย่างรวดเร็ว:
List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
วิธีอื่นที่น่าเกลียด:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");