-3

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

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

1 回答 1

1

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

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

无论哪种方式,Formatter 的文档都将提供最佳起点。

假设

  1. 湿度值的长度不能超过温度值的长度。
  2. 温度和湿度数据元素的数量大小相等。

有关如何处理上下文敏感间距的示例,请参阅我的实现。

    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    
于 2013-11-08T20:42:37.047 回答