2013-06-21 65 views
1

我正在试验按部件集成的实现方法,并试图从所有乘以一起的事物列表中抽出所有可能的udv对。所提供的代码是我的方法,除了Function对象已被替换为字符串以提高可读性,以至于人们可以将其从上下文中移除。在列表中找到所有可能的组合对象

ArrayList<String> funcObjects = giveList(CALC.MULTIPLY, function);//populate this any way you like 

//all the pairs are stored in a matrix 
int pairCounter = 0; 
String[][] udvPairs = new String[funcObjects.size() * funcObjects.size()][2]; 
//for (int skip = 0; skip < 1; skip++) { 
//commented out for sake of a better solution 
for (int i = 0; i < funcObjects.size() - 1; i++) { 
    System.out.println("i=" + i); 
    //System.out.println(function.size()); 
    for (int j = 0; j < funcObjects.size() - i; j++) { 
     System.out.println("j=" + j); 
     CalcObject u = "1"; 
     CalcObject dv = "1"; 
     for (int start = j; start <= j + i; start++) { 
      //this loop here is what is generating my u. 
      //note that it goes in order and therefore cannot 
      //account for items that are not next to each other in the list 
      //my question is how to add a fix for this 
      u = u + " * " + funcObjects.get(start); 
     } 
     for (int end = 0; end < j; end++) { 
      dv = dv + " * " + funcObjects.get(end); 
     } 
     for (int end = j + i + 1; end < funcObjects.size(); end++) { 
      dv = dv + " * " + funcObjects.get(end); 
     } 

     System.out.println("Pair " + pairCounter + "; u: " + u.toString() + " dv: " + dv.toString()); 
     udvPairs[pairCounter][0] = u; 
     udvPairs[pairCounter][1] = dv; 
     pairCounter++; 
    } 
} 

这是我的代码到目前为止。它给我的组合是正确的,但它并没有给我所有的组合。例如:

x * SIN(x) * COS(x)

即是通过列表["x","SIN(x)","COS(x)"]

会给我

i=0 
j=0 
Pair 0; u: x dv: SIN(x) * COS(x) 
j=1 
Pair 1; u: SIN(x) dv: x * COS(x) 
j=2 
Pair 2; u: COS(x) dv: x * SIN(x) 
i=1 
j=0 
Pair 3; u: x * SIN(x) dv: COS(x) 
j=1 
Pair 4; u: SIN(x) * COS(x) dv: x 

它跳过U:x * COS(x) dv: SIN(x)

所以我的问题是,人有一个想法如何使它也解释了哪些部分不相邻的组合?该程序不会抛出任何错误,我只是不知道如何完成我所需要的。

谢谢。

+0

什么'i'和'j'的值对应于你错过了呢? – John

+0

为了让u有2个字符串,我必须是1,并且j只是递增它从开始计数的位置,即从索引j开始计数。 – Seva

+0

我想那么问题是为什么你没有达到'我'和'j'的正确值。 (我试图帮助你解决你自己的问题;)) – John

回答

0

这是代码,使其工作:

ArrayList<String[]> udvPairs = new ArrayList<>(); 
String[] temp = new String[2]; 
String notOne = "1"; 
for (int i = 0; i < funcObjects.size(); i++) { 
    notOne = notOne += funcObjects.get(i); 
} 
temp[0] = "1"; 
temp[1] = notOne; 
udvPairs.add(temp); 
temp = new String[2]; 
temp[1] = "1"; 
temp[0] = notOne; 
udvPairs.add(temp); 
for (int i = 0; i < funcObjects.size() - 1; i++) { 
    //System.out.println("i=" + i); 
    //System.out.println(function.size()); 
    for (int j = 0; j < funcObjects.size() - i; j++) { 
     //System.out.println("j=" + j); 
     for (int skip = 0; skip < funcObjects.size() - i - j; skip++) { 
      //System.out.println("skip=" + skip); 
      String u = "1"; 
      String dv = "1"; 
      u += funcObjects.get(j); 
      for (int start = j + skip + 1; start <= j + i + skip; start++) { 
       u += ufuncObjects.get(start); 
      } 
      for (int end = 0; end < j; end++) { 
       dv += funcObjects.get(end); 
      } 
      for (int end = j + 1; end < j + skip + 1; end++) { 
       dv += funcObjects.get(end); 
      } 
      for (int end = j + i + 1 + skip; end < funcObjects.size(); end++) { 
       dv += funcObjects.get(end); 
      } 
      //} 
      //System.out.println("Pair " + pairCounter + "; u: " + u.toString() + " dv: " + dv.toString()); 
      temp = new String[2]; 
      temp[0] = u; 
      temp[1] = dv; 
      boolean addIt = true; 
      for (int x = 0; x < udvPairs.size(); x++) { 
       if (udvPairs.get(x)[0].equals(u) && udvPairs.get(x)[1].equals(dv)) { 
        addIt = false; 
        x = udvPairs.size(); 
       } 
      } 
      if (addIt) { 
       udvPairs.add(temp); 
      } 
      //pairCounter++; 
     } 
    } 
}