2010-04-14 20 views
11

Tôi đã tự hỏi cách dễ nhất là chuyển đổi số nguyên thành số không gian trống tương đương. Tôi cần nó cho các khoảng trống giữa các nút khi in cây tìm kiếm nhị phân. Tôi đã thử điều nàyChuyển đổi số nguyên thành số không gian trống tương đương

int position = printNode.getPosition(); 
    String formatter = "%1"+position+"s%2$s\n"; 
    System.out.format(formatter, "", node.element); 

Nhưng tôi nhận được gần gấp 3 lần không gian so với giá trị int của vị trí. Tôi không thực sự chắc chắn nếu tôi định dạng chuỗi phải không. Mọi đề xuất sẽ tuyệt vời! Nếu nó làm cho nó rõ ràng hơn, nói vị trí = 6; Tôi muốn 6 khoảng trống được in trước phần tử nút của tôi.

Trả lời

11

Tôi nghĩ bạn có nghĩa là một cái gì đó như:

int n = 6; 
    String s = String.format("%1$#"+n+"s", ""); 

System.out.format("[%13s]%n", ""); // prints "[    ]" (13 spaces) 
System.out.format("[%1$3s]%n", ""); // prints "[ ]" (3 spaces) 
+2

+1. Câu trả lời này là giải pháp đơn giản nhất cho vấn đề ban đầu của OP: OP chỉ thiếu ký tự '$'. – polygenelubricants

4

Tại sao không lặp qua số nguyên và thêm dấu cách trên mỗi lần lặp?

String spaces = ""; 
for (int i = 0 ; i < position ; i++) spaces += " "; 

Và bạn có thể sử dụng StringBuilder thay vì String, nếu position có thể nhận được rất lớn và hiệu suất là một vấn đề.

+5

Nếu bạn định làm như thế này, tôi sẽ nhấn mạnh (nếu bạn ở trong nhóm của tôi) bạn sử dụng StringBuilder. Bất kể bao nhiêu lần bạn lặp lại, việc sử dụng các chuỗi như thế này là rất kém hiệu quả và không được khuyến nghị vì trình biên dịch sẽ sử dụng nội bộ StringBuilders để thực hiện công việc. Nhưng thay vì làm điều đó một lần, nó sẽ làm điều đó mỗi vòng lặp. Ngoài ra hãy kiểm tra lớp Formatter. Đó là cuộc đàm phán doco về quyền biện minh cho các con số bằng cách sử dụng đặc tả chiều rộng. – drekka

8

Bạn có thể tạo một char[] chiều dài mong muốn, Arrays.fill nó với không gian, và sau đó tạo ra một String ra khỏi nó (hoặc chỉ cần append vào của riêng bạn StringBuilder v.v.).

import java.util.Arrays; 

int n = 6; 
char[] spaces = new char[n]; 
Arrays.fill(spaces, ' '); 
System.out.println(new String(spaces) + "!"); 
// prints "  !" 

Nếu bạn đang làm điều này với rất nhiều giá trị có thể của n, thay vì tạo và điền new char[n] mọi thời gian, bạn có thể tạo chỉ là một chuỗi thời gian đủ dài của không gian và lấy ngắn substring khi cần thiết.

+0

Tôi nghĩ rằng điều này sẽ nhanh hơn so với bộ đệm chuỗi. –

4

giải pháp foward Straight:

int count = 20; 

StringBuilder sb = new StringBuilder(count); 
for (int i=0; i < count; i++){ 
sb.append(" "); 
} 
String s = sb.toString(); 

StringBuilder là hiệu quả về mặt tốc độ.

+0

Tôi nên thêm "' String spaces = sb.toString(); "" –

+0

Phải, thêm nó vào mã. – Sylar

7

Đây là một cách dễ dàng, nhưng rác, chiều:

int count = 20; 
String spaces = String.format("%"+count+"s", ""); 

hoặc điền vào

String spaces = String.format("%20s", ""); 
+1

Tại sao điều này lại là rác rưởi? – polygenelubricants

0

Dưới đây là một ví dụ:

public class NestedLoop { 
public static void main (String [] args) { 
    int userNum = 0; 
    int i = 0; 
    int j = 0; 


    while (i<=userNum) { 
    System.out.println(i); 
    ++i; 
    if (i<=userNum) { 
    for (j=0;j<i;j++) { 
     System.out.print(" "); 
    } 
    } 
    } 
    return; 
    } 
} 

Nếu chúng ta làm userNum = 3, đầu ra sẽ là:

0 
1 
    2 
    3 

Hy vọng điều đó sẽ hữu ích!

0

Nếu một người được sẽ sử dụng một giải pháp lặp đi lặp lại dù sao, người ta có thể muốn làm điều đó một "Groovy" cách hơn, như:

def spaces=6 
print ((1..spaces).collect(" ").join()) 

Lưu ý rằng điều này không làm việc cho không gian.cho rằng bạn có thể muốn một cái gì đó giống như:

print (spaces?(1..spaces).collect(" ").join():"") 
Các vấn đề liên quan