2010-07-13 33 views
6

Vì nhiều lý do khác nhau, tôi đang cố gắng đặt chuỗi thành 2000 dấu cách. Hiện tại tôi đang sử dụng:Bạn có thể tạo chuỗi nào với 2000 "khoảng trắng"

String s = String.format("%1$-2000s"," "); 

Điều này thật tuyệt vời cho Java 5, tuy nhiên, một số nhà phát triển trong bộ phận của chúng tôi đang sử dụng 1.4 và điều này không hiệu quả.

Tôi đã tự hỏi, có cách nào khác để đạt được kết quả tương tự không? Tôi biết tôi có thể làm những việc như một vòng lặp cho thêm một không gian tại một thời điểm, nhưng tôi đang tìm kiếm một cái gì đó đơn giản như tùy chọn định dạng.

Đối với những người có thể quan tâm đến lý do tại sao tôi cần điều này, đó là bởi vì chúng tôi có một loại XML trên một dataobject rằng trên chèn vào DB là null. Sau đó nó được cập nhật với chuỗi XML, thường có kích thước khoảng 2000 ký tự. Trong Oracle đặt trước không gian này có thể ngăn chặn di chuyển hàng, do đó, tăng hiệu suất.

Cảm ơn!

+0

Chèn một dấu cách vào trường char (2000) trong cơ sở dữ liệu, sau đó chọn lại. – aehiilrs

+0

thực hiện điều này thực sự dự trữ toàn bộ khối 2000? – northpole

+0

Phiên bản Oracle nào và bạn đang sử dụng XMLTYPE, nếu vậy điều khoản lưu trữ cho XMLTYPE là gì? – oluies

Trả lời

18
char[] spacesArray = new char[2000]; 
Arrays.fill(spacesArray, ' '); 
String spaces = new String(spacesArray); 
1

Một StringBuffer và sau đó thêm khoảng trắng 2000 lần trong một vòng lặp và toString() sau đó. Tôi không nghĩ rằng có bất kỳ "đơn giản" cách để làm điều đó mà không kết thúc lên làm điều này anyway dưới bìa.

Nếu bạn làm điều này rất nhiều, nó sẽ làm cho một chức năng thư viện tốt.

+3

Thay vào đó, bạn có thể sử dụng StringBuilder để tránh chi phí đồng bộ hóa nhỏ và bạn cũng có thể khởi tạo trình xây dựng với kích thước đích để không xảy ra sự phân bổ. –

+0

StringBuilder không có sẵn trong Java 1.4 mà bản gốc yêu cầu. –

0

StringUtils.repeat(" ", 2000) (từ commons-lang)

Tuy nhiên, tôi không chắc liệu như vi-tối ưu hóa nên được thực hiện với chi phí của mã mà sẽ yêu cầu một lời nhận xét 5 dòng để giải thích tại sao điều này cần thiết. Nếu bạn làm điều đó - hãy chắc chắn để thêm một bình luận rộng rãi, nếu không hãy tưởng tượng phản ứng của những người đọc mã của bạn.

+0

ya, chức năng của tôi là rất tốt tài liệu vì lý do đó – northpole

+5

@ downvoter - bạn có thể giải thích downvote? Bạn không thích commons-lang, hoặc lưu ý của tôi về bình luận? – Bozho

1

Một chức năng ngẫu nhiên tôi tìm thấy trong thư viện cá nhân của tôi:

public static String whiteSpace2(int l) { 
    if (l==0) return ""; 
    String half=whiteSpace2(l/2); 
    if ((l&1)!=0) { 
     return half+" "+half; 
    } else { 
     return half+half; 
    } 
} 

Không tuyên bố nó là cách nhanh nhất có thể để tạo ra khoảng trắng, nhưng nó hoạt động :-)

+0

p.s. Tôi tin rằng đây là thời gian O (n) nên không thực sự là xấu .... – mikera

+1

+1 nếu một trò đùa của nó, nó khá buồn cười. –

+0

Bạn thực sự không nên xây dựng chuỗi với '+' như thế này. Sử dụng một 'StringBuilder'. Mặc dù vậy, bước 'O (log N)' là tốt đẹp. – polygenelubricants

0

Nếu không có gì khác hoạt động:

StringBuilder sb = new StringBuilder(); 
for(int i = 0; i < 2000; ++i) 
    sb.append(" "); 
String str = new String(sb); 
+7

tại sao không chỉ 'sb.toString()' –

1

Bạn có thể sử dụng lpad(' ',2000,' ') trong tuyên bố chèn trực tiếp để yêu cầu Oracle tạo giá trị bạn muốn.

Thực tế, bạn có thể đặt trường được đề cập để đặt trường này làm mặc định, điều này có thể khiến bạn không cần thay đổi nó ở nhiều nơi (nếu mã của bạn gửi null là giá trị cho trường đó, ghi đè lên mặc định).

3

câu trả lời đơn giản nhất: (cuộn để xem tất cả các mã)

String s = "                                                                                                                                                                                                                          "; // 2000 spaces 
+0

Bạn đã đếm chúng chưa? –

+1

+1 Tôi thích giải pháp này. Nếu chúng ta biết tại thời gian biên dịch những gì chuỗi là, tại sao không mã cứng nó. (Tuy nhiên, có lẽ một giải pháp khác liên quan đến cơ sở dữ liệu chính nó là tốt hơn.) Tôi đã tinh chỉnh giải pháp để làm cho nó tốt hơn một chút và trả lời câu hỏi của Pascal. Chạy nó với xác nhận được kích hoạt. Chuỗi s = ... 2000 dấu cách ...; khẳng định s.length() == 2000: "chuỗi không đổi có độ dài sai". ; – emory

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