语言独立的:分割线与多个重复性质成多行与只有一次

问题描述:

我有系如下面的每个属性:语言独立的:分割线与多个重复性质成多行与只有一次

prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop3 value5#prop5 value6#prop5 value7#prop5 value8#prop2 value9 

这意味着每个属性可以是多次在同一直线上,在具有不同值的不同位置。我正在寻找的快速且有效的方式来分割该行到行的相应量(在此情况下12:2x2x3其中与每个值的每个属性只存在一次:

prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop5 value6 
prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop5 value7 
prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop5 value8 

prop1 value1#prop2 value2#prop3 value5#prop4 value4#prop5 value6 
prop1 value1#prop2 value2#prop3 value5#prop4 value4#prop5 value7 
prop1 value1#prop2 value2#prop3 value5#prop4 value4#prop5 value8 

prop1 value1#prop2 value9#prop3 value3#prop4 value4#prop5 value6 
prop1 value1#prop2 value9#prop3 value3#prop4 value4#prop5 value7 
prop1 value1#prop2 value9#prop3 value3#prop4 value4#prop5 value8 

prop1 value1#prop2 value9#prop3 value5#prop4 value4#prop5 value6 
prop1 value1#prop2 value9#prop3 value5#prop4 value4#prop5 value7 
prop1 value1#prop2 value9#prop3 value5#prop4 value4#prop5 value8 

可以有任何数量的的特性,其可以是任何时间(> = 1)在各行中的任何顺序。

这确实是与语言无关的,但目前的实现解析器的是在vb6。

预先感谢您。

+1

搜索笛卡尔乘积。最简单的实现可能是使用递归。 – m69

这是一些产生代码的Java代码es期望的输出。希望你可以把它翻译成VB6。

public static void main(String[] args) 
{ 
    String input = "prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop3 value5#prop5 value6#prop5 value7#prop5 value8#prop2 value9"; 

    String[] pairs = input.split("#"); 

    // build a map of properties to values 
    Map<String, List<String>> propValues = new TreeMap<>(); 
    for(String pair : pairs) 
    { 
     String[] p = pair.split(" "); 
     String prop = p[0]; 
     String value = p[1]; 

     List<String> values = propValues.get(prop); 
     if(values == null) propValues.put(prop, values = new ArrayList<String>()); 
     values.add(value); 
    } 

    // create and fill an array with the number of values for each property 
    int[] sizes = new int[propValues.size()]; 
    int i=0; 
    for(String prop : propValues.keySet()) 
    { 
     sizes[i++] = propValues.get(prop).size(); 
    } 

    // create an array to hold the index of each value we're going to select 
    // all array elements initialized to 0 
    int[] idx = new int[sizes.length]; 

    // generate output 
    while(true) 
    { 
     // print the output line, selecting the indexed value for each property 
     int j=0; 
     for(String prop : propValues.keySet()) 
     { 
      String value = propValues.get(prop).get(idx[j++]); 
      System.out.print(prop + " " + value); 
      if(j < idx.length) System.out.print("#"); 
     }   
     System.out.println(); 

     // generate the next permutation of indexes 
     int k=idx.length-1; 
     for(; k>=0; k--) 
     { 
      idx[k]++; 
      if(idx[k] < sizes[k]) break; 
      idx[k] = 0; 

      // This prints a blank line whenever the last property wraps around 
      // Your example output has this, I'm not sure if it's significant 
      if(k==idx.length-1) System.out.println(); 
     } 

     // if the first index wrapped around then we're done 
     if(k < 0) break; 
    } 
} 

输出:

prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop5 value6 
prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop5 value7 
prop1 value1#prop2 value2#prop3 value3#prop4 value4#prop5 value8 

prop1 value1#prop2 value2#prop3 value5#prop4 value4#prop5 value6 
prop1 value1#prop2 value2#prop3 value5#prop4 value4#prop5 value7 
prop1 value1#prop2 value2#prop3 value5#prop4 value4#prop5 value8 

prop1 value1#prop2 value9#prop3 value3#prop4 value4#prop5 value6 
prop1 value1#prop2 value9#prop3 value3#prop4 value4#prop5 value7 
prop1 value1#prop2 value9#prop3 value3#prop4 value4#prop5 value8 

prop1 value1#prop2 value9#prop3 value5#prop4 value4#prop5 value6 
prop1 value1#prop2 value9#prop3 value5#prop4 value4#prop5 value7 
prop1 value1#prop2 value9#prop3 value5#prop4 value4#prop5 value8