定义用于将不同大小的数组打印到表中的Java方法

时间:2018-01-30 22:49:03

标签: java arrays printing

我一直致力于一个项目,我需要使用两个公式来实现卷积和相关方法,我这样做了。然后我需要定义以下方法来并排打印f,相关和卷积(这是我需要帮助搞清楚的部分):

卷积公式:

(f * g)[n] = ∑ f[n + (M - 1) - m] * g[m]

其中f是大小为N的数组,g是大小为M的数组,f * g是大小为N-M + 1的数组,用于存储卷积的结果。

相关公式:

(f ** g)[n] = ∑ f[n + m] * g[m]

其中f是大小为N的数组,g是大小为M的数组,f ** g是大小为N-M + 1的数组,用于存储相关结果。

定义以下方法并排打印f,f * g,f ** g:

private static void print(double[] f, double[] convolution, double[] correlation)

这就是我所拥有的。 main中的所有内容都是用于测试程序的驱动程序代码。我需要有关打印方法的帮助:

public static void main(String[] args) {
    double[] f = new double[18];
    for (int i = 0; i < f.length; i++) {
            f[i] = i;
    }
    double[] g1 = {0.25, 0.25, 0.5},
        g2 = {0.1, 0.2, 0.3, 0.4};

    print(f, convolution(f, g1), correlation(f, g1));
    print(f, convolution(f, g2), correlation(f, g2));

    for (int i = 0; i < f.length; i++) {
            f[i] = Math.sin(i);
    }

    print(f, convolution (f, g1), correlation(f, g1));
    print(f, convolution (f, g2), correlation(f, g2));
}

**private static void print(double[] f, double[] convolution, double[] correlation) {
    System.out.println("i\tf(i)\tconvolution[i]\tcorrelation[i]");

        for (int i = 0; i < convolution.length; i++) {
            System.out.println(i + "\t" + (f[i]) + "\t" + (convolution[i]) + "\t" 
                    + correlation[i] + "\t");

        }
            }**

private static double[] convolution (double[] f, double[] g) {
    int n = f.length - g.length + 1;                //N - M + 1
    double[] result2 = new double[n];           //create new array and define bounds

    for (int i = 0; i < n; ++i) {               //outer loop executes n times
        for (int j = 0; j < g.length; ++j) {        //inner loop executes up to the length of g
            result2[i] += f[i + (g.length - 1) - j] * g[j]; //convolution calculation
        }
    }
    return result2;

}
private static double[] correlation (double[] f, double[] g) {
    int n = f.length - g.length + 1;               // N - M + 1
    double[] result = new double[n];              // create new array and define bounds 

    for (int i = 0; i < n; ++i) {                // outer loop executes n times
        for (int j = 0; j < g.length; ++j) {    //inner loop executes up to the length of g
            result[i] += f[i + j] * g[j];      // correlation calculation
        }
    }

    return result;
}

}

这是输出应该是什么样子的一个例子。这是根据main方法中的调用的最后一次打印。我不想包含太多信息: enter image description here

这就是我所得到的。我并不真正关心格式化。 enter image description here

我似乎无法让我打印17次,而且我不确定如何将其打印出来&#34; ----&#34;对于空值。我是否使用if语句?如果我将print方法中的for循环更改为:

for (int i = 0; i < f.length; i++) {
            System.out.println(i + "\t" + (f[i]) + "\t" + (convolution[i]) + "\t" 
                    + correlation[i] + "\t");

2 个答案:

答案 0 :(得分:1)

@panasconnie有正确的概念(使用 printf() String.format()方法)但是我要加上我的两分钱反正。

正如您在示例表中看到的那样,所有数据都与标题正确对齐,并且您已经规定有一些数组不包含相同数量的索引(或元素),因此替换为&# 34; ------&#34 ;.将数组元素转换为字符串(仅用于显示目的)使我们可以轻松地执行此操作。转换从不影响任何初始数组数据,因此在原始状态下保持不变。

因为 f [] 数组是包含大多数元素的数组,所以应该在 print()方法中用于迭代的数组。无论哪个数组包含最大量索引应该是用于迭代的数组。我在下面提供的 print()方法示例将自动确定哪个数组最大,并将使用 for 循环中该数组的长度。这保证了数据的完整表格显示。

请记住,在Java中有几种不同的方法来执行此类操作。我选择使用 String.format() 方法和 System.out.printf() 方法。你可以看到两者如何适合你。它们基本相同。

以下代码被过度评论,如果不需要,显然可以删除。这只是为了您的初始利益:

private static void print(double[] f, double[] convolution, double[] correlation) {
    // Determine which array contains the most elements.
    // We will use that array length for our iteration 
    // ahead.
    int maxArrayLenth = f.length;
    if (convolution.length > maxArrayLenth) { maxArrayLenth = convolution.length; }
    if (correlation.length > maxArrayLenth) { maxArrayLenth = correlation.length; }

    // Determine the location for the start of our header
    // so as to achieve proper right alignment. This means
    // it wont matter how many digits 'i' will contain, the 
    // table will always properly align.
    int hiVal = String.valueOf(f.length).length();

    // Print the Table Header to console...
    String header = String.format("%n%" + hiVal + "s %10s %15s %15s","i", "f(i)", 
                                  "convolution[i]", "correlation[i]");
    System.out.println(header);
    // Print the Table Header Underline to the exact length of our 
    // Table Header. We use the String.join() method in conjuction 
    // with the Collection Class nCopies() method so as to create 
    // a string of "=" characters. We subtract 2 from the header 
    // length because we used the String format's newline (%n) tag
    // to create a blank line before the Header itself for a cleaner
    // display of multiple tables.
    System.out.println(String.join("", Collections.nCopies(header.length() - 2, "=")));

    // Do the iteration through all the arrays using the length
    // based on our largest array.
    for (int i = 0; i < maxArrayLenth; i++) {
        // Convert the Double Data Type element from
        // each array into a String variable. This way
        // if any particular array does not contain a
        // designated index the string for that particular
        // array element will hold "------".
        String strgF; // current element from the f[] Array
        if (i > f.length-1) { strgF = "-------"; }
        // "%.5f" is used in format() to ensure a decimal precison of 5
        else { strgF = String.format("%.5f", f[i]); }

        String conv; // current element from the convolution[] Array
        if (i > convolution.length-1) { conv = "-------"; }
        else { conv = String.format("%.5f", convolution[i]); }

        String corr; // current element from the correlation[] Array
        if (i > correlation.length-1) { corr = "-------"; }
        else { corr = String.format("%.5f", correlation[i]); }

        // Print the current Table Data line...
        System.out.printf("%" + hiVal + "d %10s %15s %15s%n", i, strgF, conv, corr);
    }
}
  

编辑:根据OP的评论

为什么要将双类型数组元素转换为字符串:

您当然可以使用 printf()方法使用&#34;%f&#34;来显示双重类型(或浮动)数据到控制台。 (或%e或%g)格式标记(或称为 转换类型字符 ):

double num1 = 0.4975282369714;
double num2 = 3.3457546760063;
double num3 = -0.1761164402327;

System.out.printf("%.5f %10.5f %10.3f", num1, num2, num3);  

会显示控制台,例如:0.49753 3.34575 -0.176

本质上, printf()方法(与 String.format()方法一样)实际上将double转换为字符串,并在之前自动设置小数精度显示它。这里的问题是,如果我们想要实际显示一个字符串(比如&#34; -------&#34;)代替双数据类型值,那么双重不存在那么我们可以& #39; t使用&#34;%f&#34;格式标记,我们需要使用不同的格式标记(&#34;%s&#34;格式标记),否则我们最终会得到 IllegalFormatConversionException 。在这种特殊情况下,最简单的解决方案是将预转换每个double类型值转换为一个特殊的String变量,该变量表示该特定的数组值。如果该值不存在(在您的情况下没有要到达的元素),则该变量将保存&#34; -------&#34;而不是Double Type值的字符串表示。这有两件事:

  1. 它允许我们在其中使用一个特定的格式标记(%s) printf()方法,以便在有条理的情况下轻松显示数据 时尚;
  2. 确保无论索引之间有多少索引 两个,三个或更多不同的特定类型值的数组,每个数组 要显示的必需值将包含某些内容,a 字符串表示的Type值或简单的破折号字符串 (&#34; -------&#34;)取决于当前的情况 迭代这些数组。
  3. 您当然可以编写一种方法来为每个迭代环境构建一个自定义格式字符串,并且每个构建一个Object数组来为该格式提供所需的数据,但是相信我,这将比运行时劳动密集型更多&# 39;值得,以后在路上阅读起来比较困难。保持简单,毕竟,它只是为了显示。

    阅读 System.out.printf() 方法。

答案 1 :(得分:0)

看起来我们正在解决同样的问题!

https://alvinalexander.com/programming/printf-format-cheat-sheet

http://www.oxfordmathcenter.com/drupal7/node/24

https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

你是否用java查看了printf方法? 您可以使用print f方法%.3f格式化答案,只包含三位小数。

尝试

for (int i=0; i<convolution.length; i++) {
    System.out.printf("%f, %.3f, %.3f,%.3f", f[i],f[i], convolution[i], correlation[i]);
    System.out.println();

}

尝试一些事情。

我理解的方式是所有内容都以字符串格式列出。 %标记了格式化需要更改或影响的值,然后是使其外观不同的字符。关闭字符串后,使用逗号并列出表格中放置或格式化数组中的值:

printf("%[flags][width][.precision]conversion-character", Values in array separated by the commas)

拜托,拜托,如果有帮助,请告诉我!我还在学习,所以可能会有错误!感谢