java - 如何从 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());
}
}
但我仍然面临错误。我不知道我哪里出错了,也不知道如何接近解决方案来制作代码。
解决方案
将这两种非常不同的排列组合起来是一个相当困难的问题。由于您使用 Java 编程,因此我强烈建议您使用 Java 提供的功能。
这个问题可以通过您的自定义Iterable<String>
whos来解决,Iterator<String>
为您提供每个next()
方法调用的唯一排列。然后使用这两个迭代器(第一个用于 3x"01"
字符,第二个用于 2x"&|"
字符)并组合它们的输出。
干得好:
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); } } } }
现在在 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; }
最后通过 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(); }
结果是您上面的问题所述的所有字符的二进制排列。
推荐阅读
- spring-boot - 如何在 CosmosDB 中处理事务 - “全有或全无”概念
- python - 如何在python中生成具有不同或不相等字符的代码
- java - 将数组分配给对象数组时出错
- javascript - Enzyme is not testing onChange method
- python-3.x - 使用 python 访问网络摄像机
- dictionary - openscad中的关联数组?
- typescript - React Native/Typescript/Eslint 错误:类型“void”不可分配给类型“CompositeAnimation”
- r - 以逗号分隔的单个字符获取因子级别
- selenium - 在硒中处理日历
- reactjs - 如何确保 API 调用在响应组件初始渲染之前接收数据?