特定数字的嵌套循环

时间:2012-01-11 22:17:17

标签: java for-loop nested-loops

我的方法有2个整数method(int ii, int xx)。我想循环一系列的值,但我想不出一种方法来做到这一点,而无需对每个值进行硬编码。

当ii = 21时,我想要xx = 19到9 当ii = 20时,我想要xx = 18到12

如此硬编码将是:

method(21,19)
method(21,18)
...
method(21,10)
method(21,9)
method(20,18)
method(20,17)
...
method(20,13)
method(20,12)

这是我到目前为止,但它没有处理特殊情况,如我不想要它做方法(4,19)

            for(int ii = 9;ii<21;ii++){
                for(int xx = 4;xx<19;xx++){
                    method(ii,xx);
                }
            }

2 个答案:

答案 0 :(得分:2)

正如Edd最初建议的那样,你会想要使用地图。我建议创建一个Range类来表示xx值的整数范围,然后您可以构建Integer - &gt;的地图。 Range(ii - &gt; xx):

static class Range {
    public final int start;
    public final int end;

    public Range(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

static final Map<Integer,Range> RANGE_MAP = new HashMap<Integer,Range>();
static {
    RANGE_MAP.put(21, new Range(9,19));
    RANGE_MAP.put(20, new Range(12,18));
    // ...
}

void calling_method() {
    for(Entry<Integer,Range> entry : RANGE_MAP.entrySet()) {
        int ii = entry.getKey();
        Range r = entry.getValue();
        for(int xx = r.start; xx <= r.end; xx++){
            method(ii,xx);
        }
    }
}

void method(int ii, int xx) {
    // do stuff
}

答案 1 :(得分:0)

它是硬编码的,但地图中的列表可以为您执行此操作:

private static final Map<Integer,List<Integer>> map = new HashMap<Integer,List<Integer>>(){{
    put(21, new ArrayList<Integer>(){{
        add(19);
        add(18);
        add(17);
        ...
    }});
    put(20, new ArrayList<Integer>(){{
        add(18);
        add(17);
        ...
    }});
}};

将地图保持为静态和最终意味着您每次使用时都不会创建它。

然后你可以像这样循环:

for(Integer ii : map.keySet()){
    for(Integer xx : map.get(ii)){
        method(ii,xx);
    }
}