如何使用特定订单进行迭代

时间:2016-11-30 20:00:03

标签: java loops iterator

我有一个方法,您可以在其中指定参数列表(test1,test2 ...)以及具有属于先前参数的有效值的列表列表。如果我想遵循给定参数的特定顺序,我如何迭代所有值?

String test1 = "parameter1";
String test2 = "parameter2";
String test3 = "parameter3";
List<String> validValuesforTest1 = Arrays.asList(new String[] { "test1", "test11" });
List<String> validValuesforTest2 = Arrays.asList(new String[] { "test2" });
List<String> validValuesforTest3 = Arrays.asList(new String[] { "test3", "test33", "test33" });

预期行为:

for (String x : validValuesforTest1) {
    for (String y : validValuesforTest2) {
         for (String z : validValuesforTest3) {
 return String.format("%s = %s, %s = %s, %s = %s", test1, x, test2, y, test3, z);
         }
    }
}

我不知道给出了多少参数。

2 个答案:

答案 0 :(得分:0)

使用递归实现这是很自然的。 编写一个获取有效值列表的方法, 另一个参数列表和一个前缀字符串。 第一个和第二个列表必须具有相同的长度。

当第一个列表为空时,递归应该终止, 并打印前缀的值。

否则(列表不为空), 迭代第一个子列表的元素, 准备递归调用的前缀, 然后使用两个列表的尾部(没有head元素)执行递归调用。

这样的事情:

private void combine(List<List<String>> lists, List<String> params, StringBuilder prefix) {
    if (lists.isEmpty()) {
        System.out.println(prefix);
        return;
    }
    for (String value : lists.get(0)) {
        StringBuilder copy = new StringBuilder(prefix);
        if (copy.length() > 0) {
            copy.append(", ");
        }
        copy.append(params.get(0)).append(" = ").append(value);
        combine(lists.subList(1, lists.size()), params.subList(1, params.size()), copy);
    }
}

使用您的示例输入,您可以这样调用它:

public void demo() {
    String test1 = "parameter1";
    String test2 = "parameter2";
    String test3 = "parameter3";
    List<String> validValuesforTest1 = Arrays.asList(new String[] { "test1", "test11" });
    List<String> validValuesforTest2 = Arrays.asList(new String[] { "test2" });
    List<String> validValuesforTest3 = Arrays.asList(new String[] { "test3", "test33", "test33" });

    combine(
        Arrays.asList(validValuesforTest1, validValuesforTest2, validValuesforTest3),
        Arrays.asList(test1, test2, test3),
        new StringBuilder());
}

获得输出:

parameter1 = test1, parameter2 = test2, parameter3 = test3
parameter1 = test1, parameter2 = test2, parameter3 = test33
parameter1 = test1, parameter2 = test2, parameter3 = test33
parameter1 = test11, parameter2 = test2, parameter3 = test3
parameter1 = test11, parameter2 = test2, parameter3 = test33
parameter1 = test11, parameter2 = test2, parameter3 = test33

答案 1 :(得分:0)

您可以创建一个方法,该方法将数组列表作为参数,并使用多个字符串,如下所示:

public static String method(List<List<String>> values, String... parameters) {
    StringBuilder sb = new StringBuilder();
    if(values.size() != parameters.length) return null;
    for(int i = 0; i < parameters.length; i++) {
        sb.append(parameters[i] + "=");
        sb.append(values.get(i));
    }
    return sb.toString();
}