2013-11-05 74 views
-1

我想知道一個程序是否具有Arraylists的組合。情景如下。可以說有3種不同的Arraylist像下面這樣。從列表列表元素中檢索所有組合

例如:

  1. [銀色,白色,灰色,紫色]
  2. [汽油,混合]
  3. [豐田,微]

組合可以像下面給出創建,在上述三位Arraylists之中。

例如:

  1. 銀汽油豐田
  2. 銀汽油微
  3. 銀混合動力豐田
  4. 銀混合微
  5. 白電油豐田
  6. 白電油微
  7. 白色混合物豐田
  8. 白色混合物微
  9. 灰色汽油豐田
  10. 灰色汽油微
  11. 灰色混合動力豐田
  12. 灰色混合微
  13. 紫汽油豐田
  14. 紫汽油微
  15. 紫混合動力豐田
  16. Purple Hybrid Micro

在我的情況下,arraylist的數量是動態的。一個數組列表的大小也是動態的。在這種情況下,我想知道使用Java實現的方法。 任何人都可以請建議我一種使用Java的方法嗎?

感謝

+4

你試過什麼? – Christian

回答

4

你可以把所有你的列表的totalList,其類型列表>。每次組合2個列表以填充所有組合案例。

下面是一個供您參考的例子,它會打印您想要的信息。

注意:它支持列表的動態數量和動態大小列表

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class Test { 

    public static void main(String[] args) { 

     List<String> listOne = Arrays.asList("Silver", "White", "Grey", 
       "Purple"); 
     List<String> listTwo = Arrays.asList("Petrol", "Hybrid"); 
     List<String> listThree = Arrays.asList("Toyota", "Micro"); 
     List<List<String>> totalList = Arrays.asList(listOne,listTwo,listThree); 

     new Test().printAllCases(totalList); 
    } 

    public void printAllCases(List<List<String>> totalList) 
    { 
     List<String> result = new ArrayList<String>(totalList.get(0)); 

     for(int index = 1; index < totalList.size() ; index++) 
     { 
      result = combineTwoLists(result, totalList.get(index)); 
     } 

     /* print */ 
     int count = 0; 
     for(String s: result) 
     { 
      System.out.printf("%d. %s\n", ++count, s); 
     } 
    } 

    private List<String> combineTwoLists(List<String> list1, List<String> list2) 
    { 
     List<String> result = new ArrayList<String>(); 
     StringBuilder sb = new StringBuilder(); 
     for(String s1 : list1) 
     { 
      for(String s2: list2) 
      { 
       sb.setLength(0); 
       sb.append(s1).append(' ').append(s2); 
       result.add(sb.toString()); 
      } 
     } 
     return result; 
    } 
} 
+0

-1他寫道:「arraylists的數量是動態的」 – alfasin

+0

@alfasin - 感謝糾正,alfasin。已經更新了動態數組arrayLists的代碼。 – MouseLearnJava

+0

+1不錯的解決方案! – alfasin

0

那麼認爲這個僞代碼:

for (i for size of array1) { 
    for (j for size of array2) { 
     for (k for size of array3) { 
      print array1[i] + array2[j] + array3[k] 
     } 
    } 
} 

在Java中是這樣的:

int i, j, k; 
int count = 0; 
for (i = 0; array1.size(); i++) { 
    for (j = 0; array2.size(); j++) { 
     for (k = 0; array3.size(); k++) { 
      count++; 
      System.out.println(count + ". " +array1.get(i) + array2.get(j) + array3.get(k)); 
     } 
    } 
} 
1

如果你不反對以外的圖書館,guava-libraries提供了一個非常好的Sets.cartesianProduct方法可以做到這一點。當然,你會結束轉換你的名單...

Set<String> colors = ImmutableSet.of("Silver", "White", "Grey", "Purple"); 
Set<String> fuelTypes = ImmutableSet.of("Petrol", "Hybrid"); 
Set<String> brands = ImmutableSet.of("Toyota", "Micro"); 

Set<List<String>> result = Sets.cartesianProduct(colors, fuelTypes, brands); 
System.out.println(result);