2017-07-22 19 views
0

我有系如下面的每個屬性:語言獨立的:分割線與多個重複性質成多行與只有一次

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

回答

1

這是一些產生代碼的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