Подтвердить что ты не робот

Преобразование целого числа в эквивалентное число пробелов

Мне было интересно, что самым простым способом является преобразование целого числа в эквивалентное число пробелов. Мне нужно это для промежутков между узлами при печати двоичного дерева поиска. Я попробовал это

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

Но я получаю почти в 3 раза больше пробелов по сравнению со значением int. Я не уверен, правильно ли форматирую строку. Любые предложения были бы замечательными! Если это станет более ясным, скажем, позиция = 6; Я хочу 6 пробелов, напечатанных перед моим элементом node.

4b9b3361

Ответ 1

Я думаю, вы имели в виду что-то вроде:

    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

Вы можете создать char[] нужной длины, Arrays.fill с пробелами, а затем создать из него String (или просто append на свой собственный StringBuilder и т.д.).

import java.util.Arrays;

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

Если вы делаете это с множеством возможных значений n, вместо создания и заполнения new char[n] каждый раз вы можете создать только одну достаточно длинную строку пробелов и при необходимости сократить substring.

Ответ 3

Это простой, но мусор, способ:

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

или заполняется

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

Ответ 4

Почему бы не перебрать целое число и не добавить пробел на каждой итерации?

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

И вы можете использовать StringBuilder вместо String, если position может стать очень большим, а производительность - проблема.

Ответ 5

Прямое решение:

int count = 20;

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

StringBuilder эффективен с точки зрения скорости.

Ответ 6

Вот пример:

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;
  }
}

Если мы создадим userNum = 3, выход будет выглядеть следующим образом:

0
 1
  2
   3

Надеюсь, что это поможет!

Ответ 7

Если бы кто-то собирался использовать итерационное решение, можно было бы сделать это более "Groovy", например:

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

Обратите внимание, что это не работает для нулевых пробелов. для этого вам может понадобиться нечто большее:

print (spaces?(1..spaces).collect(" ").join():"")