2016-05-11 1 views
1

Я написал программу Java для печати чисел от 1 до 10 с форматированием с интервалом. Используя java.util.Formatter, я не получаю ожидаемый результат. Зачем?Спецификатор формата Java, печатающий вывод повторно

Ожидаемый результат:

1 2 3 4 5 6 7 8 9 10 
    1 2 3 4 5 6 7 8 9 10 

Это мой код:

import java.util.*; 

public class CountTo10 { 
    static void formatterFunc() { 
     String myString = ""; 
     Formatter fmt = new Formatter(); 

     for(int i=1; i<=10; i++) { 
      fmt.format("%4d", i); 
      myString = myString + fmt; 
     } 
     System.out.println(myString); 
    } 

    static void stringFunc() { 
     String myString = ""; 
     for(int i=1; i<=10; i++) { 
      myString = myString + i + " "; 
     } 
     System.out.println(myString); 
    } 

    public static void main(String args[]) { 
     stringFunc(); 
     System.out.println("\n"); 
     formatterFunc(); 
    } 
} 

ответ

0

Некоторые из конструкторов java.util.Formatter взять Appendable в качестве аргумента. Но для Java API docs конструктор по умолчанию (который вы используете) использует StringBuilder. (StringBuilder реализует Appendable)

Адресат форматированного вывода является StringBuilder ...

Таким образом, каждый раз, когда вы звоните fmt.format() вы добавлением к тому же StringBuilder каждый раз.

Ваш выбор из затруднительного являются:

  1. Распределить с String конкатенации, и использовать только Formatter:

    static void formatterFunc() { 
        try(Formatter fmt = new Formatter()) { // Formatter should also be properly closed 
         for(int i=1; i<=10; i++) { 
          fmt.format("%4d", i); 
         } 
         System.out.println(fmt); 
        } 
    } 
    
  2. Используйте новый Formatter каждый раз

    static void formatterFunc() { 
        String myString = ""; 
        for(int i=1; i<=10; i++) { 
         myString = myString + new Formatter().format("%4d", i); // But needs closing strictly speaking 
        } 
        System.out.println(myString); 
    } 
    
  3. Поставка вам г собственный Appendable

    static void formatterFunc() { 
        StringBuilder sb = new StringBuilder(); 
        try(Formatter fmt = new Formatter(sb)) { // Formatter should be properly closed 
         for(int i=1; i<=10; i++) { 
          fmt.format("%4d", i); 
         } 
        } 
        System.out.println(sb.toString()); // We can print this even after Formatter has been closed 
    } 
    
Смежные вопросы