本帖最后由 DB5155 于 2010-09-26 17:25:15 编辑

解决方案 »

  1.   

    没有搞明白,p q r s是四个啊。。0 1 两个啊。。怎么个mapping规则啊?
      

  2.   


    package csdn.javase.other.ex1;import java.util.ArrayList;
    import java.util.List;public class Test2 {

    public static void main(String args[]){
    StringBuilder byteNum = new StringBuilder(); List<String> operator = new ArrayList();
    operator.add("p");
    operator.add("q");
    operator.add("r");
    operator.add("s");
    String c="[a-z]";

    for(int j=0;j < (int)Math.pow(2,4); j++){
    String bit=Integer.toBinaryString(j);
    List<String> ex = new ArrayList();
    ex.add("p");
    ex.add("+");
    ex.add("q");
    ex.add("+");
    ex.add("r");
    ex.add("+");
    ex.add("s");
    if(bit.length() <= 4){//你这里写少了个等号,以至于0111后面的二进制无法产生
    StringBuffer transSB = new StringBuffer("");
    for(int k=0;k<(4 - bit.length());k++){
    transSB.append("0");
    }
    transSB.append(bit);
    bit=transSB.toString();
    System.out.println(bit);

     
    //将式子中的字母用0,1替代掉 (这块有错误!)
    for(int i=0;i < ex.size();i++){
    if(ex.get(i).matches(c)){
    for(int k=0;k < operator.size();k++){
    if(ex.get(i).equals(operator.get(k))){
    ex.set(i,String.valueOf(bit.charAt(k)));
    continue;
    }
    }  
    }
    }
     
    for(int i=0;i<ex.size();i++){
    System.out.print(ex.get(i));
    }
    System.out.println("\n");
    }
    }
    }
    你出错的原因:你的链表第一次已经被改成了0+0+0+0了,所以你在后面无法再匹配字母了,这就是为什么第一次能够替换成0+0+0+0而后面不能替换成其他数字的原因
      

  3.   

    晕,没有高亮。更正:
    if(bit.length()  < 4)也是可以的
      

  4.   

    换个思维,4个变量都应0,1两个数,总共有16中可能,可以看成是0-15的二进制码,这样就很好输出啊!
    下面是我写的一个程序,不知道能不能满足楼主的需求,程序如下:
    public class Main {
    public static void main(String[] args) {
    int[] p = new int[16];
    int[] q = new int[16];
    int[] r = new int[16];
    int[] s = new int[16];

    //总共有16种组合,也就是0-15的二进制位
    String temp;
    int len = 0;
    for(int i=0; i<p.length; i++) {
    temp = Integer.toBinaryString(i);
    // 在位数小于4的前面补0
    len = temp.length();
    for(int j=0; j<4-len; j++) {
    temp = "0" + temp;
    }

    //因为0的ascii编码为48,相减的结果就是数字0-9
    p[i] = temp.charAt(0) - 48;
    q[i] = temp.charAt(1) - 48;
    r[i] = temp.charAt(2) - 48;
    s[i] = temp.charAt(3) - 48;
    }

    //输出结果
    for(int i=0; i<p.length; i++) {
    System.out.println(p[i] + "+" + q[i] + "+" + r[i] + "+" + s[i]);
    }
    }
    }输出结果是:
    0+0+0+0
    0+0+0+1
    0+0+1+0
    0+0+1+1
    0+1+0+0
    0+1+0+1
    0+1+1+0
    0+1+1+1
    1+0+0+0
    1+0+0+1
    1+0+1+0
    1+0+1+1
    1+1+0+0
    1+1+0+1
    1+1+1+0
    1+1+1+1
      

  5.   

    简短代码,贴上:public class Binary {
    public static void main(String[] args) {
    for (int i = 0; i < 16; i++) {
    int n = i;
    Stack<Integer> stack = new Stack<Integer>();
    while (n != 0) {
    stack.push(n % 2);
    n = n / 2;
    }
    int[] temp = new int[4];
    int sum = stack.size();
    for (int k = 0; k < 4 - sum; k++)
    temp[k] = 0;
    for (int k = 4 - sum; k < 4; k++)
    temp[k] = stack.pop();
    for (int k = 0; k < 3; k++)
    System.out.print(temp[k] + "+");
    System.out.println(temp[3]);
    }
    }
    }
    运行结果:
    0+0+0+0
    0+0+0+1
    0+0+1+0
    0+0+1+1
    0+1+0+0
    0+1+0+1
    0+1+1+0
    0+1+1+1
    1+0+0+0
    1+0+0+1
    1+0+1+0
    1+0+1+1
    1+1+0+0
    1+1+0+1
    1+1+1+0
    1+1+1+1
      

  6.   

    这段代码比上段代码简洁点:public class Binary {
    public static void main(String[] args) {
    for (int i = 0; i < 16; i++) {
    String str = Integer.toBinaryString(i);
    char[] temp = new char[4];
    int sum = str.length();
    for (int k = 0; k < 4 - sum; k++)
    temp[k] = '0';
    for (int k = 4 - sum, j = 0; k < 4; k++)
    temp[k] = str.charAt(j++);
    for (int k = 0; k < 3; k++)
    System.out.print(temp[k] + "+");
    System.out.println(temp[3]);
    }
    }
    }
      

  7.   

    弱弱的问一句:可以用四个嵌套for循环吗?
      

  8.   

    我也想了一个,不过可能楼主不是单纯的要输出这样的结果吧?
    public class test2 {
    public static void main(String[] args) {
            int p=0,q=0,r=0,s=0,i=1;
            while(i<16){
             s = i%2;
             if (s==0)
             r=r+1;
                if (r==2){
                 r=0;
                 q=q+1;
                }
                if (q==2){
                 q=0;
                 p=p+1;
                }
                System.out.println(p+"+"+q+"+"+r+"+"+s);
             i++;
            }
        }
    }
      

  9.   

    2楼的方法试了,管用,呵呵
    其他楼的还没试呢,谢谢大家了,慢慢研究大家的方法
    下面这个也是要输出一样要求的结果 怎么不行呢?
    结果是输出了p+q+s+r八次 大家研究研究呀 
    public class test4 { /**
     * @param args
     */
     public static void replace(ArrayList<String> operator){
         //Stacks stack=new Stacks();
         //扫描表达式中字母并存入数组letter中
            StringBuffer byteNum=new StringBuffer();
         String s="[a-z]";
         ArrayList<String> letter=new ArrayList();
         //StringTokenizer t=new StringTokenizer(operator,s,true);
         for(int i=0;i<operator.size();i++){
         if(operator.get(i).matches(s)&&!letter.contains(operator.get(i))){
         letter.add(operator.get(i)) ;
         }
         }
         int times=letter.size();//字母的个数
         for(int j=0;j<(int)Math.pow(2, times);j++){
         String bit=Integer.toBinaryString(j);
         //存储二进制数,位数不足字母个数时,前面补0
        
         for(int k=0;k<(times-bit.length());k++){
         byteNum.append("0");
         }
             byteNum.append(bit);
             //将operator中的字母用byteNum中的0,1替代
            // int ps=0;
             for(int p=0;p<operator.size();p++){
              if(operator.get(p).equals(s)){
              for(int i=0;i<letter.size();i++){
              if(operator.get(p).equals(letter.get(i))){
              operator.set(p, String.valueOf(byteNum.charAt(i)) );
             
              }
              }
             
              }
                       
             }
             for(int m=0;m<operator.size();m++){
              System.out.print(operator.get(m));
             }
        
         }
        }
     public static void main(String args[]){
         ArrayList<String> put=new ArrayList<String>();
         put.add("p");
         put.add("+");
         put.add("q");
         put.add("+");
         put.add("s");
                    put.add("+");
         put.add("r");   
         Operation.replace(put);
        
        }
    }
      

  10.   

    在你原来代码上修改:
    在ex.add("s");之后加上:
        ArrayList<String> ex_back = (ArrayList<String>) ex.clone();在for (int i = 0; i < ex.size(); i++) {
        System.out.print(ex.get(i));
      }
    之后加上:
        ex.clear();ex = (ArrayList<String>) ex_back.clone();
    出错原因如2楼。
    这种做法在内存上比较浪费,但最为贴合你的原始代码。
      

  11.   

    用格式化来做比较方便
    代码:
    public class test1{
    public static void main(String[] args) {
    test1 t = new test1();

    System.out.println("Output:p+r+s+q");
    t.run("p+r+s+q");

    System.out.println("---------------");

    System.out.println("Output:prsq");
    t.run("prsq");
    }

    public void run(String pattern) {
    char[] chars = pattern.toCharArray();
    int outputCount = 0;

    for(int i = 0; i < chars.length; i ++) {
    if(chars[i] != '+')
    outputCount ++;
    }

    String outputFormat = pattern.replaceAll("[pqrs]", "%s");
    for(int i = 0; i < outputCount * outputCount; i ++) {
    String mask = String.format("%" + outputCount + "s", Integer.toBinaryString(i)).replaceAll(" ", "0"); System.out.println(String.format(outputFormat, getChars(mask)));
    }
    }

    private Object[] getChars(String mask) {
    Object[] objs = new Object[mask.length()];
    for(int i = 0; i < mask.length(); i ++) {
    objs[i] = mask.charAt(i);
    }
    return objs;
    }
    }输出:Output:p+r+s+q
    0+0+0+0
    0+0+0+1
    0+0+1+0
    0+0+1+1
    0+1+0+0
    0+1+0+1
    0+1+1+0
    0+1+1+1
    1+0+0+0
    1+0+0+1
    1+0+1+0
    1+0+1+1
    1+1+0+0
    1+1+0+1
    1+1+1+0
    1+1+1+1
    ---------------
    Output:prsq
    0000
    0001
    0010
    0011
    0100
    0101
    0110
    0111
    1000
    1001
    1010
    1011
    1100
    1101
    1110
    1111