Tôi có mảng chuỗi ( String[]
) và tôi cần xóa mục đầu tiên. Làm thế nào tôi có thể làm điều đó một cách hiệu quả?
Tôi có mảng chuỗi ( String[]
) và tôi cần xóa mục đầu tiên. Làm thế nào tôi có thể làm điều đó một cách hiệu quả?
Câu trả lời:
Kích thước của mảng trong Java không thể thay đổi. Vì vậy, về mặt kỹ thuật, bạn không thể xóa bất kỳ phần tử nào khỏi mảng.
Một cách để mô phỏng việc xóa một phần tử khỏi mảng là tạo một mảng mới, nhỏ hơn, sau đó sao chép tất cả các phần tử từ mảng ban đầu vào mảng mới, nhỏ hơn.
String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);
Tuy nhiên , tôi sẽ không đề xuất phương pháp trên. Bạn thực sự nên sử dụng a List<String>
. Danh sách cho phép bạn thêm và xóa các mục khỏi bất kỳ chỉ mục nào. Điều đó sẽ tương tự như sau:
List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
ArrayList
là O (n).
ArrayList
, nhưng không phải đối với LinkedList
.
Arrays.copyOfRange()
là cho API9 +
Cách đơn giản nhất có lẽ là như sau - về cơ bản bạn cần tạo một mảng mới nhỏ hơn một phần tử, sau đó sao chép các phần tử bạn muốn giữ lại vào đúng vị trí.
int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
Lưu ý rằng nếu bạn thấy mình thực hiện loại thao tác này thường xuyên, đó có thể là dấu hiệu cho thấy bạn thực sự nên sử dụng một loại cấu trúc dữ liệu khác, ví dụ như danh sách được liên kết. Mỗi lần tạo một mảng mới là một phép toán O (n), có thể tốn kém nếu mảng của bạn lớn. Một danh sách liên kết sẽ cung cấp cho bạn O (1) loại bỏ phần tử đầu tiên.
Một ý tưởng thay thế là không xóa mục đầu tiên mà chỉ cần tăng một số nguyên trỏ đến chỉ mục đầu tiên đang được sử dụng. Người dùng của mảng sẽ cần phải tính đến phần bù này, nhưng đây có thể là một cách tiếp cận hiệu quả. Lớp Java String thực sự sử dụng phương thức này trong nội bộ khi tạo chuỗi con.
Arrays.copyOfRange()
Là.
Bạn không thể làm điều đó một cách nhanh chóng. Mảng trong Java có kích thước cố định. Hai điều bạn có thể làm là:
Bạn có thể sử dụng System.arraycopy
cho một trong hai. Cả hai đều là O (n), vì chúng sao chép tất cả trừ 1 phần tử.
Nếu bạn thường xuyên xóa phần tử đầu tiên, hãy cân nhắc sử dụng LinkedList
thay thế. Bạn có thể sử dụng LinkedList.remove
, đó là từ Queue
giao diện, để thuận tiện. Với LinkedList
, loại bỏ phần tử đầu tiên là O (1). Trên thực tế, loại bỏ bất kỳ phần tử nào là O (1) khi bạn có một ListIterator
vị trí đó. Tuy nhiên, truy cập một phần tử tùy ý theo chỉ mục là O (n).
Một phương pháp xấu xí thay thế:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");