Làm cách nào để chúng tôi có thể cắt một giá trị StringBuilder
mà không phải trả phí bằng cách sử dụng StringBuilder.toString().trim()
và do đó tạo String
mới và/hoặc một phiên bản StringBuilder
mới cho mỗi cuộc gọi cắt?Làm thế nào để cắt chuỗi StringBuilder?
Trả lời
Tại sao StringBuilder không có phương pháp cắt()
- Bởi vì đó là cách nó được thiết kế. Hãy thử yêu cầu các nhà thiết kế.
- Vì không có nhiều cuộc gọi cho nó.
- Vì chuỗi
trim()
ngữ nghĩa và chữ ký phù hợp với các chuỗi có thể thay đổi, mặc dù điều đó có thể gây tranh cãi.
Dù bằng cách nào, câu trả lời không liên quan đến việc giải quyết vấn đề của bạn.
và cách chúng tôi có thể cắt một giá trị StringBuilder?
Cách đơn giản nhất là sử dụng StringBuilder.toString().trim()
...
Tôi không muốn sử dụng StringBuilder.toString(). Trim().
Trong trường hợp đó, vì vậy bạn cần phải làm những gì trim()
không nằm trong bìa: khớp và xóa khoảng trắng phía trước và cuối. Vì API StringBuilder không có hỗ trợ regex, bạn sẽ cần thực hiện điều này một cách khó khăn; tức là bằng cách lặp lại các ký tự từ phía trước về phía trước và lùi lại để xem những ký tự nào cần được xóa, v.v.
Bạn có chắc chắn không thích làm điều đó một cách dễ dàng? Nếu không, Q này & A có một số triển khai ví dụ, phân tích, điểm chuẩn, vân vân:
Trên thực tế tôi đang trong một vòng lặp mà tôi phải so sánh chuỗi StringBuilder này với nhiều giá trị khác vì vậy nếu tôi gọi StringBuilder.toString(). trim() mỗi lần, nó sẽ tạo ra một cá thể mới và tôi không muốn tạo một đối tượng String mới mỗi lần.
Mặt trái là việc xóa ký tự khỏi đầu chuỗi StringBuilder đòi hỏi phải sao chép tất cả các ký tự còn lại.
Có thể bạn nên tắt StringBuilder hoàn chỉnh thành Chuỗi để bắt đầu, sau đó khi bạn sử dụng trim()
và substring()
và tương tự, bạn sẽ không sao chép các ký tự. (Các phương thức này hoạt động bằng cách tạo một Chuỗi mới cổ phần mảng sao lưu của Chuỗi gốc ...vì vậy bạn chỉ cần sao chép thông tin điều khiển của chuỗi. CẬP NHẬT - Trong Java 7 họ đã thay đổi hành vi của trim
và substring
để họ sử dụng một constructor String bản một mảng con của mảng ủng hộ)
Đã trải qua một câu trả lời tương tự của bạn: http://stackoverflow.com/questions/7510422/when-should-we-change -a-string-to-a-stringbuilder. Và tôi sẽ nói bạn đã trả lời điều này một cách hoàn hảo. –
@KazekageGaara - thankyou :-) –
"Tại sao không X xảy ra? Bởi vì nó không". Rất xây dựng. Bạn có biết bất kỳ lý do nào tại sao các nhà thiết kế không thực hiện toString()? – Buffalo
Bạn có thể chuyển đổi StringBuilder
bản sao thành string
mà sau này có thể được cắt.
sb.toString().trim();//sb is stringBuilder Instance.
Tại sao StringBuilder không có phương pháp cắt().?
Hmm .. StringBuilder
là như String
, chỉ cần một sự khác biệt nhỏ mà nó có thể được sửa đổi sau khi tạo khác nó là giống như chuỗi.
Như đã nêu trong diễn đàn, Các hoạt động chủ yếu trên một StringBuilder là append và chèn các phương pháp. Tôi đoán chúng được đề xuất để hỗ trợ các chuỗi có thể thay đổi, giống như với StringBuffer
. Và nếu bạn có thể hoàn thành công việc bằng một cuộc gọi nhỏ đến một số phương pháp khác và sau đó là phương pháp mong muốn thì đó là vấn đề gì. Tại sao bạn muốn thực hiện tương tự trong nhiều lớp.
Làm cách nào để cắt xén giá trị StringBuilder?
Như đã nói bởi những người khác stringBuilder.toString().trim();
Tôi không muốn sử dụng
StringBuilder.toString().trim()
.
Vấn đề lựa chọn, bất kỳ lý do cụ thể nào cho điều này?
Thực ra tôi đang ở trong một vòng lặp mà tôi phải so sánh chuỗi StringBuilder này với nhiều giá trị khác vì vậy nếu tôi gọi StringBuilder .toString(). trim() mỗi lần, nó sẽ tạo ra một cá thể mới và tôi không muốn tạo một đối tượng String mới mỗi lần –
Sử dụng 'char []' của riêng bạn và các dấu phân cách sau đó. Kiểm tra mã 'java.lang.String'. – mschonaker
Sử dụng StringBuilder.toString().trim()
nhưng lưu trong biến.
Ví dụ:
String myTrimmedString = myStringBuilder.toString().trim();
Nó không có một phương pháp trim()
vì nó là rất dễ dàng và có phần ưa thích sử dụng đối tượng không thay đổi. Hãy tưởng tượng một sợi đang cắt tỉa StringBuilder
trong khi một sợi khác đang gắn vào nó. Hãy tưởng tượng các lỗi và sự kỳ quặc có thể gây ra trong mã của bạn.
Hãy tưởng tượng một chuỗi đang cắt xén StringBuilder trong khi một chuỗi khác đang thêm vào nó. Tình huống này cũng có thể xảy ra trong hoạt động nối thêm trong khi một chuỗi đang chắp thêm thứ gì đó và một là nối thêm thứ gì đó khác ... vậy trong trường hợp đó là gì? nó không nên hỗ trợ nối thêm –
@PramodKumar Tôi sẽ tưởng tượng VM chỉ cho phép một thứ ghi vào char [] tại một thời điểm. Tuy nhiên đặt cùng một hạn chế về lần đọc sẽ là vô lý. Trên một đồng thời đọc và viết tôi sẽ đoán nó khối đọc, làm cho điều này không phải là vấn đề. Tất cả phụ thuộc vào việc triển khai VM. Nó rất có thể trim() sẽ làm việc tốt. Đó là một tình huống giả định để cho thấy nó dễ dàng hơn bao nhiêu để thực hiện các vật thể bất biến. Và họ sử dụng ít bộ nhớ hơn. – iracigt
Mặc dù giải pháp của bạn là chính xác, biện minh của bạn là cách tắt. StringBuilder không an toàn cho luồng bởi thiết kế *, vì vậy, như Pramod Kumar đã nói, ** mọi hoạt động đồng thời ** trên đó đều nguy hiểm. Bất cứ ai sử dụng một StringBuilder trong nhiều chủ đề mà không cần đồng bộ hóa trên nó cần chụp. StringBuffer là phiên bản chuỗi an toàn của StringBuilder, vì nó sử dụng đồng bộ hóa nội bộ. * (StringBuilder đã được đưa vào Java cho các tình huống mà bạn chắc chắn chỉ có một luồng sẽ truy cập vào nó một lúc và vì vậy muốn làm mà không cần phải có sự đồng bộ hóa trong StringBuffer.) – megaflop
Tôi không biết những gì bạn đang cố gắng đạt được, nhưng nếu bạn đang lo lắng về hiệu suất có lẽ bạn có thể thực hiện cắt như bạn đang phụ thêm vào StringBuilder.
stringbuilder.append(string.trim())
- 1. StringBuilder: làm thế nào để có được chuỗi cuối cùng?
- 2. làm thế nào để cắt mảng vector char hoặc chuỗi?
- 3. Làm thế nào để cắt ngắn chuỗi UTF8 trong PHP?
- 4. Làm thế nào để bạn kế thừa StringBuilder trong vb.net?
- 5. làm thế nào để cắt cuối n byte của một chuỗi trong bash chuỗi choping?
- 6. Làm thế nào để 'cắt' trên null?
- 7. Làm thế nào để cắt bớt một chuỗi để phù hợp trong một container?
- 8. Chuỗi StringBuilder có thay đổi không?
- 9. Làm thế nào để xóa (không cắt) trong Vim?
- 10. Khi nào sử dụng StringBuilder?
- 11. Dung lượng của StringBuilder thay đổi như thế nào?
- 12. Nơi để sử dụng StringBuffer/StringBuilder hơn Chuỗi
- 13. Làm thế nào để cắt trường cuối cùng từ một chuỗi vỏ
- 14. Làm thế nào để cắt khoảng trống cuối của một chuỗi?
- 15. Làm thế nào để cắt ngắn một chuỗi với độ dài cụ thể trong perl?
- 16. Làm thế nào để cắt ngắn chuỗi thành độ dài yêu cầu trong sdk iphone?
- 17. Làm thế nào để cắt một chuỗi sử dụng một delimiter
- 18. Làm thế nào để cắt một chuỗi thành một số mong muốn trong delphi?
- 19. Làm thế nào để áp dụng cắt trên gấu trúc Loạt các chuỗi
- 20. Làm thế nào để StringBuilder trống một lần nữa trong .NET 3.5?
- 21. Lớp chuỗi Python như StringBuilder trong C#?
- 22. Chuỗi ở đâu hữu ích hơn StringBuilder?
- 23. Chuỗi cắt trong java
- 24. Thay thế Regex bên trong một StringBuilder
- 25. StringBuilder hoặc + =
- 26. SVG - Làm thế nào để cắt ảnh thành hình tròn?
- 27. Làm thế nào để cắt một NSArray trong Objective-C?
- 28. Java: Làm thế nào để "cắt" một mảng byte?
- 29. Làm thế nào để cắt bớt một bảng bằng Doctrine?
- 30. Làm thế nào để "cắt" một std_logic_vector trong VHDL?
Tôi có thể hỏi tại sao bạn không muốn sử dụng 'StringBuilder.toString(). Trim()'? –
Thực ra tôi đang ở trong một vòng lặp mà tôi phải so sánh chuỗi StringBuilder này với nhiều giá trị khác vì vậy nếu tôi gọi StringBuilder.toString(). Trim() mỗi lần, nó sẽ tạo một cá thể mới và tôi không muốn tạo String mới đối tượng mỗi lần. –
Bạn có thể sử dụng 'toString(). Trim()' nhiều lần tùy ý. Vui lòng chỉnh sửa câu hỏi của bạn và thêm nhận xét trước đó của bạn để làm rõ. – mschonaker