2012-06-19 38 views
22

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?

+1

Tôi có thể hỏi tại sao bạn không muốn sử dụng 'StringBuilder.toString(). Trim()'? –

+1

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. –

+0

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

Trả lời

18

Tại sao StringBuilder không có phương pháp cắt()

  1. Bởi vì đó là cách nó được thiết kế. Hãy thử yêu cầu các nhà thiết kế.
  2. Vì không có nhiều cuộc gọi cho nó.
  3. 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()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 trimsubstring để họ sử dụng một constructor String bản một mảng con của mảng ủng hộ)

+1

Đã 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. –

+0

@KazekageGaara - thankyou :-) –

+5

"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

0

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. 
1

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.

StringBuilder

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?

+1

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 –

+0

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

1

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.

+2

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 –

+0

@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

+1

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

3

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())

Các vấn đề liên quan