Hàm sẽ trả về giá trị mới nếu việc loại bỏ subStr khỏi chuỗi thành công, nếu không, nó sẽ trả về -1 trong mọi trường hợp
Ví dụ -
const str = 'drsfgdrrtdr'; console.log[str.removeStr['dr', 3]];
Sản lượng dự kiến -
'drsfgdrrt'
Hãy viết mã cho điều này -
Ví dụ
const str = 'drsfgdrrtdr'; const subStr = 'dr'; const num = 2; removeStr = function[subStr, num]{ if[!this.includes[subStr]]{ return -1; } let start = 0, end = subStr.length; let occurences = 0; for[; ;end < this.length]{ if[this.substring[start, end] === subStr]{ occurences++; }; if[occurences === num]{ return this.substring[0, start] + this.substring[end, this.length]; }; end++; start++; } return -1; } String.prototype.removeStr = removeStr; console.log[str.removeStr[subStr, num]];
đầu ra
Đầu ra cho mã này trong bảng điều khiển sẽ là -
drsfgrtdr
Hiểu mã -
Hàm removeStr[] trước tiên kiểm tra nếu không có một lần xuất hiện của subStr thì chúng ta nên thoát ra và trả về -1
Sau đó, nó sử dụng thuật toán cửa sổ trượt để ghi lại số lần xuất hiện của subStr trong chuỗi [kích thước của cửa sổ bằng độ dài của subStr]
Ban đầu, chúng tôi bắt đầu từ cửa sổ ngoài cùng bên trái, sau đó chúng tôi tiếp tục trượt cửa sổ của mình cho đến khi cuối cửa sổ chạm đến cuối chuỗi ban đầu
Nếu theo cách của chúng tôi, số lần xuất hiện bằng với số lần xuất hiện được yêu cầu, chúng tôi sẽ cắt bớt lần xuất hiện đó khỏi chuỗi và trả về chuỗi mới do đó thu được
Nếu chúng ta lặp qua toàn bộ chuỗi, điều đó có nghĩa là không có đủ số lần xuất hiện của subStr trong chuỗi và trong trường hợp đó, chúng ta nên trả về -1 và thoát khỏi hàm
Cuối cùng, chúng ta thêm thuộc tính removeStr vào String. nguyên mẫu để chúng ta có thể gọi nó là một hàm chuỗi
Tôi đang làm việc với mã javascript để tìm lần xuất hiện thứ n của một ký tự trong chuỗi. Sử dụng hàm
'drsfgdrrt'6, chúng tôi có thể nhận được lần xuất hiện đầu tiên của ký tự. Bây giờ thách thức là có được lần xuất hiện thứ n của ký tự. Tôi đã có thể nhận được lần xuất hiện thứ ba thứ hai, v.v. bằng cách sử dụng mã được cung cấp bên dưới
function myFunction[] {
var str = "abcdefabcddesadfasddsfsd.";
var n = str.indexOf["d"];
document.write["First occurence " +n ];
var n1 = str.indexOf["d",parseInt[n+1]];
document.write["Second occurence " +n1 ];
var n2 = str.indexOf["d",parseInt[n1+1]];
document.write["Third occurence " +n2 ];
var n3 = str.indexOf["d",parseInt[n2+1]];
document.write["Fourth occurence " +n3];
// and so on ...
}
Kết quả được đưa ra dưới đây
First occurence 3
Second occurence 9
Third occurence 10
Fourth occurence 14
Fifth occurence 18
Sixth occurence 19
Tôi muốn khái quát hóa tập lệnh để tôi có thể tìm thấy lần xuất hiện thứ n của ký tự vì đoạn mã trên yêu cầu chúng tôi lặp lại tập lệnh n lần. Hãy cho tôi biết nếu có một phương pháp tốt hơn hoặc thay thế để làm điều tương tự. Sẽ thật tuyệt nếu chúng ta chỉ đưa ra sự xuất hiện [trong thời gian chạy] để lấy chỉ mục của ký tự đó
Thêm một số tiện ích mở rộng hữu ích cho kiểu Chuỗi trong Dart, để tìm xem một chuỗi có chứa chuỗi khác nhiều lần không
Gần đây tôi đã gặp sự cố này khi đang làm việc trên Shortcut Keeper, ứng dụng Flutter dành cho máy tính để bàn của tôi
Tôi cần tìm cách kiểm tra xem một chuỗi như “Command-K Command-T” có chuỗi con “Command” nhiều lần hay không và nếu có thì chuỗi con thứ hai bắt đầu xuất hiện từ chỉ mục nào
Để giải quyết vấn đề này, cuối cùng tôi đã viết một vài phương thức mở rộng đơn giản cho kiểu Chuỗi của Dart, điều này có thể hữu ích cho bất kỳ ai gặp phải vấn đề này
vấn đề chung
Nói cách khác, chúng ta cần tìm
1] Nếu một chuỗi chứa một chuỗi khác [
'drsfgdrrt'7] nhiều lần và
2]
'drsfgdrrt'8 nơi có thể tìm thấy lần xuất hiện thứ hai này
Sau đó, chúng tôi có thể mở rộng điều này hơn nữa để có thể tìm thấy các vị trí xảy ra lần thứ n của
'drsfgdrrt'7
Tất nhiên, chúng ta cũng có thể giải quyết vấn đề này bằng các biểu thức chính quy [thông qua lớp RegExp của Dart], nhưng tôi thích cách dễ đọc hơn được trình bày ở đây
Dung dịch
Tìm sự xuất hiện thứ hai của một chuỗi con
Tiện ích mở rộng mà tôi đã kết thúc là một tiện ích khá đơn giản
extension SecondOccurenceOfSubstring on String { int secondIndexOf[String stringToFind] { if [indexOf[stringToFind] == -1] return -1; return indexOf[stringToFind, indexOf[stringToFind] + 1]; } bool hasSecondOccurence[String stringToFind] { return secondIndexOf[stringToFind] != -1; } }
Ở đây, chúng tôi tận dụng tham số tùy chọn thứ hai [
const str = 'drsfgdrrtdr'; const subStr = 'dr'; const num = 2; removeStr = function[subStr, num]{ if[!this.includes[subStr]]{ return -1; } let start = 0, end = subStr.length; let occurences = 0; for[; ;end < this.length]{ if[this.substring[start, end] === subStr]{ occurences++; }; if[occurences === num]{ return this.substring[0, start] + this.substring[end, this.length]; }; end++; start++; } return -1; } String.prototype.removeStr = removeStr; console.log[str.removeStr[subStr, num]];0] của phương thức
const str = 'drsfgdrrtdr'; const subStr = 'dr'; const num = 2; removeStr = function[subStr, num]{ if[!this.includes[subStr]]{ return -1; } let start = 0, end = subStr.length; let occurences = 0; for[; ;end < this.length]{ if[this.substring[start, end] === subStr]{ occurences++; }; if[occurences === num]{ return this.substring[0, start] + this.substring[end, this.length]; }; end++; start++; } return -1; } String.prototype.removeStr = removeStr; console.log[str.removeStr[subStr, num]];1 từ thư viện cốt lõi của Dart, để đặt vị trí bắt đầu tìm kiếm chuỗi từ đó. Nếu không tìm thấy chuỗi, chúng tôi trả về -1 thông thường
Phương thức
String s1 = "Command-K Command-T"; s1.secondIndexOf["Command"]; // Returns 10 s1.hasSecondOccurence["Command"]; // Returns true s1.secondIndexOf["Control"]; // Returns -1 s1.hasSecondOccurence["Control"]; // Returns false String s2 = "Give it away give it away give it away now"; s2.secondIndexOf["away"]; // Returns 210 là một cách thuận tiện để kiểm tra xem một chuỗi con có xuất hiện nhiều lần trong chuỗi được cung cấp hay không
Sau đó chúng ta có thể chỉ cần sử dụng nó như thế này
String s1 = "Command-K Command-T"; s1.secondIndexOf["Command"]; // Returns 10 s1.hasSecondOccurence["Command"]; // Returns true s1.secondIndexOf["Control"]; // Returns -1 s1.hasSecondOccurence["Control"]; // Returns false String s2 = "Give it away give it away give it away now"; s2.secondIndexOf["away"]; // Returns 21
Điều này hoạt động rất tốt, vì vậy chúng tôi có thể tiến thêm một bước và xây dựng tiện ích mở rộng tổng quát hơn, để tìm vị trí của bất kỳ sự xuất hiện nào của chuỗi con trong chuỗi
Tìm sự xuất hiện thứ n của một chuỗi con
Bây giờ, chúng tôi muốn cung cấp một phương thức, chẳng hạn như chúng tôi có thể tìm chỉ mục của lần xuất hiện thứ tư [n = 4] của một chuỗi con trong một chuỗi
String s3 = "Give it away give it away give it away give it away give it away now"; s3.nThIndexOf["away", 4]; // Returns 47
Trong ví dụ trên, chuỗi con
String s1 = "Command-K Command-T"; s1.secondIndexOf["Command"]; // Returns 10 s1.hasSecondOccurence["Command"]; // Returns true s1.secondIndexOf["Control"]; // Returns -1 s1.hasSecondOccurence["Control"]; // Returns false String s2 = "Give it away give it away give it away now"; s2.secondIndexOf["away"]; // Returns 211 thứ tư có thể được tìm thấy sau 47 ký tự trong chuỗi cung cấp của chúng tôi
String s1 = "Command-K Command-T"; s1.secondIndexOf["Command"]; // Returns 10 s1.hasSecondOccurence["Command"]; // Returns true s1.secondIndexOf["Control"]; // Returns -1 s1.hasSecondOccurence["Control"]; // Returns false String s2 = "Give it away give it away give it away now"; s2.secondIndexOf["away"]; // Returns 212
Chúng ta có thể sử dụng phần mở rộng này để làm điều đó
'drsfgdrrt'2
Một lần nữa, chúng tôi áp dụng chiến lược tương tự như trên, với phương pháp
const str = 'drsfgdrrtdr'; const subStr = 'dr'; const num = 2; removeStr = function[subStr, num]{ if[!this.includes[subStr]]{ return -1; } let start = 0, end = subStr.length; let occurences = 0; for[; ;end < this.length]{ if[this.substring[start, end] === subStr]{ occurences++; }; if[occurences === num]{ return this.substring[0, start] + this.substring[end, this.length]; }; end++; start++; } return -1; } String.prototype.removeStr = removeStr; console.log[str.removeStr[subStr, num]];1, để tiến gần hơn mỗi lần đến lần xuất hiện thứ n mà chúng tôi muốn. Để giúp hiểu rõ hơn, đây là những gì xảy ra trong phương thức
String s1 = "Command-K Command-T"; s1.secondIndexOf["Command"]; // Returns 10 s1.hasSecondOccurence["Command"]; // Returns true s1.secondIndexOf["Control"]; // Returns -1 s1.hasSecondOccurence["Control"]; // Returns false String s2 = "Give it away give it away give it away now"; s2.secondIndexOf["away"]; // Returns 214 khi chúng ta gọi nó bằng
String s1 = "Command-K Command-T"; s1.secondIndexOf["Command"]; // Returns 10 s1.hasSecondOccurence["Command"]; // Returns true s1.secondIndexOf["Control"]; // Returns -1 s1.hasSecondOccurence["Control"]; // Returns false String s2 = "Give it away give it away give it away now"; s2.secondIndexOf["away"]; // Returns 215
Dưới đây là một số ví dụ khác sử dụng tiện ích mở rộng này
'drsfgdrrt'5
Giờ đây, chúng tôi có thể dễ dàng sử dụng các tiện ích mở rộng chuỗi này ở bất cứ đâu chúng tôi cần loại chức năng này trong mã Dart của mình