有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中自动生成内部循环

我试图找到一种按需生成内部循环的方法(并将深度作为变量)

在下面的示例中,我试图生成一个引用列表,例如jobo。2.2.2.2.2.2其中每个.2都添加到内部循环中

以下是我在5个深度级别(I,j,k,l)手动实现新循环时得到的信息:

 public void buildTaskList(){
    String jobName ="jobo";
    String last="";
    long max=3;
    List<String> tasks = new ArrayList<>();


    for (long i = 1; i <= max; i++) {
        for (long j = 1; j <= max; j++) {
            if (j==max){
                last="*";
                tasks.add(jobName+"."+i+"."+j+last);
            }else {
                last="";
                for (long k = 1; k <= max; k++) {
                    if (k==max){
                        last="*";
                        tasks.add(jobName+"."+i+"."+j+"."+k+last);
                    }else {
                        last="";
                        for (long l = 1; l <= max; l++) {
                            if (l==max){
                                last="*";
                                tasks.add(jobName+"."+i+"."+j+"."+k+"."+l+last);
                            }else{
                                last="";
                                for (long m = 1; m <= max; m++) {
                                    if (m==max){
                                        last="*";
                                        tasks.add(jobName+"."+i+"."+j+"."+k+"."+l+"."+m+last);
                                    }else{
                                        last="";
                                        for (long n = 1; n <= max; n++) {
                                            if (n==max)last="*";else last="";
                                            tasks.add(jobName+"."+i+"."+j+"."+k+"."+l+"."+m+"."+n+last);
                                        }
                                    }

                                }
                            }

                        }
                    }

                }
            }

        }
    }
    tasks.add(jobName+"."+(max+1)+last);
    System.out.println(tasks);
    }

结果如下:

jobo.1.1.1.1.1.1, jobo.1.1.1.1.1.2, jobo.1.1.1.1.1.3*, jobo.1.1.1.1.2.1, jobo.1.1.1.1.2.2, jobo.1.1.1.1.2.3*, jobo.1.1.1.1.3*, jobo.1.1.1.2.1.1, jobo.1.1.1.2.1.2, jobo.1.1.1.2.1.3*, jobo.1.1.1.2.2.1, jobo.1.1.1.2.2.2, jobo.1.1.1.2.2.3*, jobo.1.1.1.2.3*, jobo.1.1.1.3*, jobo.1.1.2.1.1.1, jobo.1.1.2.1.1.2, jobo.1.1.2.1.1.3*, jobo.1.1.2.1.2.1, jobo.1.1.2.1.2.2, jobo.1.1.2.1.2.3*, jobo.1.1.2.1.3*, jobo.1.1.2.2.1.1, jobo.1.1.2.2.1.2, jobo.1.1.2.2.1.3*, jobo.1.1.2.2.2.1, jobo.1.1.2.2.2.2, jobo.1.1.2.2.2.3*, jobo.1.1.2.2.3*, jobo.1.1.2.3*, jobo.1.1.3*, jobo.1.2.1.1.1.1, jobo.1.2.1.1.1.2, jobo.1.2.1.1.1.3*, jobo.1.2.1.1.2.1, jobo.1.2.1.1.2.2, jobo.1.2.1.1.2.3*, jobo.1.2.1.1.3*, jobo.1.2.1.2.1.1, jobo.1.2.1.2.1.2, jobo.1.2.1.2.1.3*, jobo.1.2.1.2.2.1, jobo.1.2.1.2.2.2, jobo.1.2.1.2.2.3*, jobo.1.2.1.2.3*, jobo.1.2.1.3*, jobo.1.2.2.1.1.1, jobo.1.2.2.1.1.2, jobo.1.2.2.1.1.3*, jobo.1.2.2.1.2.1, jobo.1.2.2.1.2.2, jobo.1.2.2.1.2.3*, jobo.1.2.2.1.3*, jobo.1.2.2.2.1.1, jobo.1.2.2.2.1.2, jobo.1.2.2.2.1.3*, jobo.1.2.2.2.2.1, jobo.1.2.2.2.2.2, jobo.1.2.2.2.2.3*, jobo.1.2.2.2.3*, jobo.1.2.2.3*, jobo.1.2.3*, jobo.1.3*, jobo.2.1.1.1.1.1, jobo.2.1.1.1.1.2, jobo.2.1.1.1.1.3*, jobo.2.1.1.1.2.1, jobo.2.1.1.1.2.2, jobo.2.1.1.1.2.3*, jobo.2.1.1.1.3*, jobo.2.1.1.2.1.1, jobo.2.1.1.2.1.2, jobo.2.1.1.2.1.3*, jobo.2.1.1.2.2.1, jobo.2.1.1.2.2.2, jobo.2.1.1.2.2.3*, jobo.2.1.1.2.3*, jobo.2.1.1.3*, jobo.2.1.2.1.1.1, jobo.2.1.2.1.1.2, jobo.2.1.2.1.1.3*, jobo.2.1.2.1.2.1, jobo.2.1.2.1.2.2, jobo.2.1.2.1.2.3*, jobo.2.1.2.1.3*, jobo.2.1.2.2.1.1, jobo.2.1.2.2.1.2, jobo.2.1.2.2.1.3*, jobo.2.1.2.2.2.1, jobo.2.1.2.2.2.2, jobo.2.1.2.2.2.3*, jobo.2.1.2.2.3*, jobo.2.1.2.3*, jobo.2.1.3*, jobo.2.2.1.1.1.1, jobo.2.2.1.1.1.2, jobo.2.2.1.1.1.3*, jobo.2.2.1.1.2.1, jobo.2.2.1.1.2.2, jobo.2.2.1.1.2.3*, jobo.2.2.1.1.3*, jobo.2.2.1.2.1.1, jobo.2.2.1.2.1.2, jobo.2.2.1.2.1.3*, jobo.2.2.1.2.2.1, jobo.2.2.1.2.2.2, jobo.2.2.1.2.2.3*, jobo.2.2.1.2.3*, jobo.2.2.1.3*, jobo.2.2.2.1.1.1, jobo.2.2.2.1.1.2, jobo.2.2.2.1.1.3*, jobo.2.2.2.1.2.1, jobo.2.2.2.1.2.2, jobo.2.2.2.1.2.3*, jobo.2.2.2.1.3*, jobo.2.2.2.2.1.1, jobo.2.2.2.2.1.2, jobo.2.2.2.2.1.3*, jobo.2.2.2.2.2.1, jobo.2.2.2.2.2.2, jobo.2.2.2.2.2.3*, jobo.2.2.2.2.3*, jobo.2.2.2.3*, jobo.2.2.3*, jobo.2.3*, jobo.3.1.1.1.1.1, jobo.3.1.1.1.1.2, jobo.3.1.1.1.1.3*, jobo.3.1.1.1.2.1, jobo.3.1.1.1.2.2, jobo.3.1.1.1.2.3*, jobo.3.1.1.1.3*, jobo.3.1.1.2.1.1, jobo.3.1.1.2.1.2, jobo.3.1.1.2.1.3*, jobo.3.1.1.2.2.1, jobo.3.1.1.2.2.2, jobo.3.1.1.2.2.3*, jobo.3.1.1.2.3*, jobo.3.1.1.3*, jobo.3.1.2.1.1.1, jobo.3.1.2.1.1.2, jobo.3.1.2.1.1.3*, jobo.3.1.2.1.2.1, jobo.3.1.2.1.2.2, jobo.3.1.2.1.2.3*, jobo.3.1.2.1.3*, jobo.3.1.2.2.1.1, jobo.3.1.2.2.1.2, jobo.3.1.2.2.1.3*, jobo.3.1.2.2.2.1, jobo.3.1.2.2.2.2, jobo.3.1.2.2.2.3*, jobo.3.1.2.2.3*, jobo.3.1.2.3*, jobo.3.1.3*, jobo.3.2.1.1.1.1, jobo.3.2.1.1.1.2, jobo.3.2.1.1.1.3*, jobo.3.2.1.1.2.1, jobo.3.2.1.1.2.2, jobo.3.2.1.1.2.3*, jobo.3.2.1.1.3*, jobo.3.2.1.2.1.1, jobo.3.2.1.2.1.2, jobo.3.2.1.2.1.3*, jobo.3.2.1.2.2.1, jobo.3.2.1.2.2.2, jobo.3.2.1.2.2.3*, jobo.3.2.1.2.3*, jobo.3.2.1.3*, jobo.3.2.2.1.1.1, jobo.3.2.2.1.1.2, jobo.3.2.2.1.1.3*, jobo.3.2.2.1.2.1, jobo.3.2.2.1.2.2, jobo.3.2.2.1.2.3*, jobo.3.2.2.1.3*, jobo.3.2.2.2.1.1, jobo.3.2.2.2.1.2, jobo.3.2.2.2.1.3*, jobo.3.2.2.2.2.1, jobo.3.2.2.2.2.2, jobo.3.2.2.2.2.3*, jobo.3.2.2.2.3*, jobo.3.2.2.3*, jobo.3.2.3*, jobo.3.3*, jobo.4*

有人知道如何通过变量int depth=123;来简化和控制它吗

谢谢


共 (3) 个答案

  1. # 1 楼答案

    您可以使用递归(参见wikihttps://en.wikipedia.org/wiki/Recursion_(computer_science)

    例如(草稿,不检查)

    @Test
    public void buildTaskList1() {
        String jobName ="job";
        int depth=5;
        int max=3;
        List<String> tasks = new ArrayList<>();
        for (long i = 1; i <= max; i++) {
            buildTaskListRecursion(max, depth, tasks, jobName + "."+i);
        }
        tasks.add(jobName+"."+(max+1)+"*");
    }
    
    
    public void buildTaskListRecursion(int max,int depth, List<String> tasks, String jobName){
        String last="";
        for (long j = 1; j <= max; j++) {
            if (j==max){
                last="*";
                tasks.add(jobName+"."+j+last);
            }else {
                depth ;
                if(depth > 0) {
                    buildTaskListRecursion(max, depth, tasks, jobName+"."+j);
                } else {
                    tasks.add(jobName+"."+j);
                }
            }
        }
    }
    
  2. # 2 楼答案

    此选项可避免递归,并在决定序列中的下一个元素时简单计算:

    private static class LevelGenerator implements Iterator<String> {
        private int[] current;  // min,min,min => min,min,min+1 => ... max,max,max
        private int min, max;   // at each position in current[] array
        private String next;    // to be returned when next() is called
    
        public LevelGenerator(int levels, int min, int max) {
            this.current = new int[levels];
            for (int i=0; i<levels; i++) this.current[i] = min;
            this.next = output();
            this.min = min;
            this.max = max;
        }
    
        /** 
         * Int array to string
         */
        private String output() {
            StringBuilder sb = new StringBuilder();
            for (int i : current) sb.append("." + i);
            return sb.toString();
        }
    
        /**
         * Updates current and next
         * counts as a human would: increments the last index that is not yet `max`,
         *    and then places all elements after it to `min`
         */
        private String step() {            
            for (int i=current.length-1; i>=0; i ) {
                if (current[i] < max) { 
                    current[i] ++;
                    for (int j=i+1; j<current.length; j++) {
                        current[j] = min;
                    }
                    return output(); // next step is ready
                }
            }
            return null; // no next step
        }
    
        @Override
        public String next() {
            if (next == null) throw new IllegalStateException("iteration is finished");
            String output = next;
            next = step();
            return output;
        }
        @Override
        public boolean hasNext() {
            return next != null;
        }
    }
    
    public static void main(String ... args) {
        LevelGenerator l = new LevelGenerator(3, 1, 4);
        while (l.hasNext()) {
            System.out.println("job" + l.next());
        }
    }
    

    本例的输出为:

    job.1.1.1
    job.1.1.2
    job.1.1.3
    job.1.1.4
    job.1.2.1
    job.1.2.2
    job.1.2.3
    job.1.2.4
    job.1.3.1
    job.1.3.2
    job.1.3.3
    job.1.3.4
    job.1.4.1
    job.1.4.2
    job.1.4.3
    job.1.4.4
    job.2.1.1
    ...
    job.4.4.4
    
  3. # 3 楼答案

    一,。支持指数

    创建深度大小的索引堆栈

    二,。正确处理水平

    你需要一个currentDepth索引才能知道你在哪里。一开始是0。每当一个项目增加时,将一个新项目推送到以0为索引的堆栈中。当一个项目超出最大值时,从堆栈中弹出它并增加上一个元素。当第一个元素弹出时,您完成了所有工作

    三,。你需要从逻辑上知道你在哪里

    或者,您可以生成代码

    但这要复杂得多

    编辑

    根据Bdzzaid的合法要求,我将简要介绍复合设计模式。首先,让我们看看他与我们分享的页面上的图表:

    enter image description here

    资料来源:https://dzone.com/articles/composite-design-pattern-in-java-1

    这本书很好,我可以全心全意地推荐给未来的读者。我们的想法是,我们以树状的方式使用非常相似的组件组成。在我们的例子中,该模式应用于一个堆栈,在所有情况下都可以将其视为一棵具有单个分支的树。以这种方式考虑这一点是有益的,因为我们可能希望添加对多个循环的支持,甚至可能在某个时候以一种非对称的方式。现在,在我们的例子中,这些组件是级别/索引,它们一起构成堆栈(或者更一般地说,树)的组成部分

    这种模式可以在许多不同的情况下重复使用,因此,如果您还没有熟悉它,建议您熟悉它