Java使用printf来格式化数组的输出

时间:2013-11-08 19:19:05

标签: java arrays printf

当我运行程序时,这是输出:

run:
70.3   70.8   73.8   77.0   80.7   83.4   84.5   84.4   83.4   80.2   76.3   72.0   
69 67 66 64 66 69 67 67 70 69 69 70BUILD SUCCESSFUL (total time: 0 seconds)

我希望我的程序显示如下,其中数字在垂直和水平方向上以相等的间距对齐:

70.3   70.8   73.8   77.0   80.7   83.4   84.5   84.4   83.4   80.2   76.3   72.0   
69     67     66     64      66    69     67     67     70     69     69     70

问题是,我真的不知道如何在一个声明为String的数组上使用printf,该数组包含上面提到的一行数字,这些数字从读取.txt文件中获取这些数字。以下是我的代码片段:

// create token1
    String token1 = "";

    // create Scanner inFile1
    Scanner inFile1 = new Scanner(new File
    ("/Users/timothylee/KeyWestTemp.txt")).
            useDelimiter(",\\s*");

    // create temps1
    List<String> temps1 = new LinkedList<String>();

    // while loop
    while(inFile1.hasNext()){

        // find next
        token1 = inFile1.next();

        // initialize temps1
        temps1.add(token1);
    }

    // close inFile1
    inFile1.close();

    // create array
    String[] tempsArray1 = temps1.toArray(new String[0]);

    // for-each loop
    for(String s : tempsArray1){

        // display s
        System.out.printf(s + "\n");
    }

    // create token2
    String token2 = "";

    // create Scanner inFile2
    Scanner inFile2 = new Scanner(new File
    ("/Users/timothylee/KeyWestHumid.txt")).
            useDelimiter(",\\s*");

    // create temps2
    List<String> temps2 = new LinkedList<String>();

    // while loop
    while(inFile2.hasNext()){

        // find next
        token2 = inFile2.next();

        // initialize temps2
        temps2.add(token2);
    }

    // close inFile2
    inFile2.close();

    // create array
    String[] tempsArray2 = temps2.toArray(new String[0]);

    // for-each loop
    for(String ss : tempsArray2){

        // display ss
        System.out.printf("15s", ss);
    }

1 个答案:

答案 0 :(得分:1)

考虑到您希望垂直和水平的间距相等,用标签替换空格将不起作用,因为行包含不同长度的值。第二行数据必须知道其“父”数据元素占用了多少空间。因此,仅为格式指定公共width参数也不起作用。

唯一的例外是,如果您可以保证温度值不会超过99.9或低于10.0,那么您可以假设数据所需的总空间为4 + the amount of spacing you desire

无论哪种方式,documentation for Formatter都将提供最佳起点。

假设

  1. 湿度值的长度不能超过温度值的长度。
  2. 温度和湿度数据元素的大小相等。
  3. 有关如何处理上下文敏感间距的示例,请参阅my implementation

        public static void main (String[] args) throws java.lang.Exception
        {
          final List<String> temperatures = Arrays.asList("70.3", "700.8", "73.8", "77.0", "80.7", "83.4", "84.5", "84.4", "83.4", "80.2");
          final List<String> humidity = Arrays.asList("69", "670", "66",  "64", "66", "69", "67", "67", "70", "69");
          final Integer[] context = new Integer[temperatures.size()];
    
          final Integer spacing = 2; //declare the spacing you desire
    
          final StringBuilder sb = new StringBuilder();
         for(int i =0; i < temperatures.size(); ++i) {
            final String str = temperatures.get(i);
            final Integer totalSpace = str.length() + spacing;
            final String formatted = String.format("%-"+ totalSpace +"s",  str);
            context[i] = totalSpace; 
            sb.append(formatted);
          }
    
          sb.append("\n");
    
         for(int i =0; i < humidity.size(); ++i)  {
            final String str = humidity.get(i);
            final String formatted = String.format("%-"+ context[i] +"s",  str);
            sb.append(formatted); 
          }
    
          System.out.println(sb.toString());
    
          }
    

    <强>结果

    Success time: 0.08 memory: 380160 signal:0
    
    70.3  700.8  73.8  77.0  80.7  83.4  84.5  84.4  83.4  80.2  
    69    670    66    64    66    69    67    67    70    69