2014-03-25 83 views
0

的元素的最近我实现的代码为下面 假设我有2个数组作为 -组合多个阵列

arr1 = [a,b,c] 

arr2 = [d,e] 

和应该尽可能

output = [ad,ae,bd,be,cd,ce] 

现在假设我有多个阵列。

为如:

arr1=[a,b,c] 

arr2=[d,e] 

arr3=[f,g,h,i] 

arrN=[x,y,z,h,o] 

output = [adf..x,adf..y and so on] 

如何实现这一点JAVA?好心帮

我尝试:

for(int i=0;i<arr1.length();i++) 
{ 
for(int j=0;i<arr2.length();j++) 
{ 
System.out.print(arr1[i] + arr2[j]); 
} 
} 
+0

发布您的尝试。 – Maroun

+0

使用4个循环有什么问题? –

+0

请参阅编辑 – ikh

回答

2

这是我在来自多个阵列(容器)得到的组合的尝试。

private List<List<T>> getCombination(int currentIndex, List<TempContainer<T>> containers) { 
    if (currentIndex == containers.size()) { 
     // Skip the items for the last container 
     List<List<T>> combinations = new ArrayList<List<T>>(); 
     combinations.add(new ArrayList<T>()); 
     return combinations; 
    } 
    List<List<T>> combinations = new ArrayList<List<T>>(); 
    TempContainer<T> container = containers.get(currentIndex); 
    List<T> containerItemList = container.getItems(); 
    // Get combination from next index 
    List<List<T>> suffixList = getCombination(currentIndex + 1, containers); 
    int size = containerItemList.size(); 
    for (int ii = 0; ii < size; ii++) { 
     T containerItem = containerItemList.get(ii); 
     if (suffixList != null) { 
      for (List<T> suffix : suffixList) { 
       List<T> nextCombination = new ArrayList<T>(); 
       nextCombination.add(containerItem); 
       nextCombination.addAll(suffix); 
       combinations.add(nextCombination); 
      } 
     } 
    } 
    return combinations; 
} 

该方法采用包含项目的容器列表。例如容器1将具有[a,b],容器2将具有[c,d,e]。该方法可以采用任意数量的容器。 //容器类被声明如下:

public class TempContainer<T> { 
    private List<T> items; 
    public void setItems(List<T> items) { 
     this.items = items; 
    } 

    public List<T> getItems() { 
     return items; 
    } 
} 

调用此方法如下:不同类型的

List<String> list1 = new ArrayList<String>(); 
list1.add("1"); 
list1.add("2"); 
List<String> list2 = new ArrayList<String>(); 
list2.add("3"); 
list2.add("4"); 
list2.add("5"); 
TempContainer container1 = new TempContainer(); 
container1.setItems(list1); 
TempContainer container2 = new TempContainer(); 
container2.setItems(list2); 
List<TempContainer> containers = new ArrayList<TempContainer>(2); 
containers.add(container1); 
containers.add(container2); 
// Get combinations 
List<List<T>> combinations = getCombination(0, containers); 
+0

它不适用于4个容器。 –

+0

@nazar_art你用4个容器得到什么问题?我已经尝试过4个和更多的容器,它已经工作。 – Priyesh

+0

它因'NullPointerException'失败。 –

0

只是简单 -

ArrayList<Integer> combination(int[] ar1, int[] ar2) 
{ 
    ArrayList<Integer> result = new ArrayList<int>(); 
    for (int i1 : ar1) 
    { 
     for (int i2 : ar2) 
     { 
      result.add(i1 * i2); 
     } 
    } 
    return result; 
} 

嗯,我认为递归是解决一般情况。

import java.util.*; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     ArrayList<int[]> arrays = new ArrayList<int[]>(); 
     arrays.add(new int[] { 1, 2, 3 }); 
     arrays.add(new int[] { 4, 5 }); 
     arrays.add(new int[] { 6, 7 }); 

     ArrayList<Integer> result = combination(arrays); 
     for (int i : result) 
     { 
      System.out.println(i); 
     } 
    } 

    static ArrayList<Integer> combination(ArrayList<int[]> arrays) 
    { 
     if (arrays.size() == 0) 
      return null; 

     ArrayList<Integer> result = new ArrayList<Integer>(); 
     combination_sub(arrays, 0, result); 
     return result; 
    } 
    static void combination_sub(ArrayList<int[]> arrays, int idx, ArrayList<Integer> result) 
    { 
     if (arrays.size() == idx) 
     { 
      result.add(1); 
      return; 
     } 

     int[] ar = arrays.get(idx); 

     ArrayList<Integer> sub_result = new ArrayList<Integer>(); 
     combination_sub(arrays, idx + 1, sub_result); 

     for (int i : ar) 
     { 
      for (int sub_i : sub_result) 
      { 
       result.add(i * sub_i); 
      } 
     } 
    } 
} 
+0

超过2个数组? – Shwet

+0

@Shwet 3数组 - > 3循环,4数组 - > 4循环,......你想要几个数组吗?如果是这样,请稍等... – ikh

+1

尝试使用递归获取更多数组。 – StaNov

1

什么具有成阵列的阵列:

String[] arr1 = { "a", "b", "c" }; 

    String[] arr2 = { "d", "e" }; 

    String[] arr3 = { "f", "g", "h", "i" }; 

    String[][] arrays = new String[][] { arr1, arr2, arr3 }; 

    public void mix(String[][] arrays) { 

     if (arrays.length > 0) { 
      List<String> result = Arrays.asList(arrays[0]); 

      for (int i = 1; i < arrays.length - 1; i++) { 
      String[] aux = arrays[i]; 
      for (int j = 0; j < aux.length; j++) { 
       result.add(j, result.get(j) + aux[j]); 
      } 
      } 
     } 
    } 
0

我有类似的要求,但对集合。这是Priyesh解决方案的修改版本。

注意:我删除了依赖于TempContainer<T>类。

public class TestCombinations { 

@Test 
public void test() { 

    final List<Object> l1 = new ArrayList<Object>(); 
    l1.add(1); 
    l1.add(2); 
    final List<Object> l2 = new ArrayList<Object>(); 
    l2.add("3"); 
    l2.add("4"); 
    l2.add("5"); 
    final List<Object> l3 = new ArrayList<Object>(); 
    l3.add(true); 
    l3.add(false); 

    final List<List<Object>> c = new ArrayList<>(3); 
    c.add(l1); 
    c.add(l2); 
    c.add(l3); 

    // Get combinations 
    final List<List<Object>> m = this.combine(c); 
    System.out.println(m); 

} 

public List<List<Object>> combine(final List<List<Object>> containers) { 
    return this.combineInternal(0, containers); 
} 

private List<List<Object>> combineInternal(final int currentIndex, 
     final List<List<Object>> containers) { 
    if (currentIndex == containers.size()) { 
     // Skip the items for the last container 
     final List<List<Object>> combinations = new ArrayList<>(); 
     combinations.add(Collections.emptyList()); 
     return combinations; 
    } 

    final List<List<Object>> combinations = new ArrayList<>(); 
    final List<Object> containerItemList = containers.get(currentIndex); 
    // Get combination from next index 
    final List<List<Object>> suffixList = this.combineInternal(
      currentIndex + 1, containers); 

    final int size = containerItemList.size(); 
    for (int i = 0; i < size; i++) { 
     final Object containerItem = containerItemList.get(i); 
     if (suffixList != null) { 
      for (final List<Object> suffix : suffixList) { 
       final List<Object> nextCombination = new ArrayList<>(); 
       nextCombination.add(containerItem); 
       nextCombination.addAll(suffix); 
       combinations.add(nextCombination); 
      } 
     } 
    } 

    return combinations; 
} 

}