首页 > 解决方案 > 如何从 2 个函数中提取字符并产生输出?

问题描述

这只是我目前正在处理的代码的一个代码片段。此代码接受& and |0 and 1作为输入。它正在生成一系列字符串,即 ||| 到 &&& 和一系列整数 000 到 111。

public static void main(String[] args)
    {
        String a;                         //CODE PRODUCING ||| TO &&&
        for(int i=3;i<=3;i++) {
            String p="";

            for(int j=0;j<=i;j++) {
                for(int m=0;m<j;m++) {
                    p=p+"&";    }
            for(int m=0;m<i-j;m++) {
                p=p+"|";    }
            printAllPermutations(p);
            p="";
            }

       int n=3;                          //CODE PRODUCING 000 TO 111
       int rows = (int) Math.pow(2,n);

       for (i=0; i<rows; i++) {
           for (int j=n-1; j>=0; j--) {
               int pp=(i/(int) Math.pow(2, j))%2;
               System.out.print(pp);
               }      
           System.out.println();
           }
        }
    }

这是我得到的代码输出:

|||
&||
|&|
||&
&&|
&|&
|&&
&&&
000
001
010
011
100
101
110
111

我现在需要的是产生系列 0|0|0 到 0&0&0,0|0|1 到 0&0&1 的输出,最后到 1|1|1 到 1&1&1。

下面是我尝试过的代码片段。我创建了另一个函数,我尝试从上面的代码中引入产生字符串 p(具有 ||| 到 &&&) 和 pp(000 到 111) 的值,并将每个字符存储在一个数组中:

for (int i=0; i < pp.length(); i++){
        if (i % 2 != 0){
          a = pp.substring(0,i-1) + p.substring(0,i-1) + pp.substring(i, pp.length())+p.substring(i, pp.length());
        }
      }

但我仍然面临错误。我不知道我哪里出错了,也不知道如何接近解决方案来制作代码。

标签: javastringfunction

解决方案


将这两种非常不同的排列组合起来是一个相当困难的问题。由于您使用 Java 编程,因此我强烈建议您使用 Java 提供的功能。

这个问题可以通过您的自定义Iterable<String>whos来解决,Iterator<String>为您提供每个next()方法调用的唯一排列。然后使用这两个迭代器(第一个用于 3x"01"字符,第二个用于 2x"&|"字符)并组合它们的输出。

干得好:

  1. Iterable<String>生成排列的自定义。请注意,它扩展 HashSet<String>Iterable存储排列的位置。该方法initialize递归地将所有排列添加到 Set:

    public class BinaryPermutation extends HashSet<String> {
    
        private final Iterator<String> iterator;
        private final String token;
    
        public BinaryPermutation(String token, int n) {
            this.token = token;
            this.initialize("", n);
            this.iterator = super.iterator();
        }
    
        private void initialize(String string, int iteration) {
            if (iteration == 0) {
               this.add(string);
            } else {
                for (char ch: token.toCharArray()) {
                    initialize(string + Character.toString(ch), iteration - 1);
                }
            }
        }
    }
    
  2. 现在在 Main 类或任何地方创建一个将 2 个字符串组合在一起的静态方法(例如:011+ |&= 0|1&1):

    private static String combineString(String s1, String s2) {
        String combined = "";
        for (int i=0; i<Math.max(s1.length(), s2.length()); i++) {
            if (i<s1.length()) { combined += Character.toString(s1.charAt(i)); }
            if (i<s2.length()) { combined += Character.toString(s2.charAt(i)); }
        }
        return combined;
    }  
    
  3. 最后通过 2 个自定义迭代器执行调用并组合它们的输出:

    Iterator<String> numbers = new BinaryPermutation("01", 3).iterator();
    Iterator<String> operators = new BinaryPermutation("&|", 2).iterator();
    
    while (numbers.hasNext()) {
        String number = numbers.next();
        while (operators.hasNext()) {
            String operator = operators.next();
            String permutation = combineString(number, operator);
            System.out.println(permutation);
        }
        operators = new BinaryPermutation("&|", 2).iterator();
    }
    

结果是您上面的问题所述的所有字符的二进制排列。


推荐阅读