打印易经卦象

Print out Yijing Hexagram Symbols

我在编码时遇到了问题,我似乎无法找到我搞砸的地方,甚至找不到我得到错误结果的原因。

首先,让我解释一下任务。 是关于《易经卦象》的。 左边的是原始的,右边的是我的代码应该给我的结果。 基本上每个“六卦”都有6条可下可不可下的线。

所以一共有

2^6 = 64 个可能的“卦”

任务是计算并编写一个方法来打印所有可能的组合。

这就是我目前的情况:

public class test {
    
    public String toBin (int zahl) {
        if(zahl ==0) return "0";
        if (zahl ==1 ) return "1";
        return ""+(toBin( zahl/2)+(zahl%2));
    }
    
    public void show (String s) {
        for (char c : s.toCharArray()){
            if (c == '1'){
                System.out.println("--- ---");
            }
            if(c=='0'){
                System.out.println("-------");
            }
         
        }
    }
    
    public void ausgeben (){
        for(int i = 0 ; i < 64; i++) {
            show (toBin(i));
        }
    }
}

问题是,当我用“10”测试 'show' 方法时,我得到 3 行而不是预期的 2 行。

public class runner {

    public static void main(String[] args){
        test a = new test();
        a.ausgeben();
        a.show("10");
    }
}

我遇到的另一个问题是,由于我正在转换为二进制文件,所以有时我没有足够的行,因为例如二进制文件中的 10 是 0001010,但缺少第一个“0”。我怎样才能在不做太多改变的情况下以简单的方式实现它们?

我对这一切还很陌生,所以如果我没有解释清楚或犯了任何错误,请随时告诉我。

您的问题简化为打印所有长度为 6 的二进制字符串。我会使用以下代码片段:

  String format = "%06d";
  for(int i = 0; i < 64; i++)         
  {    
    show(String.format(format, Integer.valueOf(Integer.toBinaryString(i))));
    System.out.println();
  }

如果您不想打印前导零,请将 String.format(..) 替换为 Integer.toBinaryString(i)

如果您使用 Integer.toBinaryString method combined with the String.format and String.replace 方法,您可能会发现它更容易。

String binary = String.format("%6s", Integer.toBinaryString(zahl)).replace(' ', '0');

这会将数字转换为二进制,将其格式化为六个空格宽的字段(必要时使用前导空格),然后将空格替换为 '0'.

嗯,有很多方法可以用零填充一个字符串,或者创建一个已经用零填充的二进制字符串。

例如,您可以这样做:

public String padToSix( String binStr ) {
    return "000000".substring( 0, 5 - binStr.length() ) + binStr;
}

这将检查您的字符串的长度,并从 "000000" 字符串中取尽可能多的零来填充它最多六个。

或者您可以简单地将您的转换方法(它是递归的,这并不是真正必要的)替换为专门处理六位数字的方法:

public static String toBin (int zahl) {
    char[] digits = { '0','0','0','0','0','0' };
    int currDigitIndex = 5;

    while ( currDigitIndex >= 0 && zahl > 0 ) {
        digits[currDigitIndex] += (zahl % 2);
        currDigitIndex--;
        zahl /= 2;
    }

    return new String(digits);
}

这个从右到左修改字符数组(最初只有零)。它将当前位的值添加到给定位置的字符。 '0' + 0'0''0' + 1'1'。因为你事先知道你有六位数字,所以你可以从右边开始,然后走到左边。如果您的数字只有四位数字,那么我们没有接触的两位数字将是 '0',因为字符数组就是这样初始化的。

确实有很多方法可以实现同样的事情。