2016-11-30 140 views
1

我有一种方法,您可以指定一个参数列表(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); 
     } 
    } 
} 

在哪里,我不知道有多少给定参数。

+0

您是否熟悉递归? –

+0

不多,你认为可以用它做吗? – Elsa

+0

那么将每个参数映射到该参数的有效值列表呢?如果参数的遍历顺序需要特定,则可以使用LinkedHashMap。 –

回答

0

这很自然地使用递归来实现。 编写一个方法,其中包含有效值列表, 另一个参数列表以及一个前缀字符串。 第一个和第二个列表必须具有相同的长度。

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

否则(列表不为空), 遍历第一子列表中的元素, 准备的前缀递归调用, 然后执行与两个列表的尾部递归调用(不头元件)。

事情是这样的:

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 
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(); 
} 
+0

StringBuilder允许你修改你的输出字符串。 –