2014-09-06 3 views
2

Я пытаюсь получить все возможные перестановки ArrayList, которые имеют ту же длину, что и inputListList. То есть ArrayList из 1,2,3 приведет к 123, 132, 213, 231, 321, 312, не включая более короткие перестановки, такие как 1, 2, 12, 13 ... и т. д. Вот код, который у меня есть до сих пор:Получить ArrayList из всех возможных перестановок ArrayList

public void getAllPermutations(ArrayList<coordinate> coords) { 
     ArrayList<coordinate> sub = new ArrayList<coordinate>(); 
     permutateSub(sub, coords); 
    } 

    private ArrayList<ArrayList<coordinate>> permutateSub(ArrayList<coordinate> sub, 
      ArrayList<coordinate> coords) { 
     int n = coords.size(); 
     if(n == 0) System.out.println(sub); 
     else { 
      if(sub.size()==n) { 
      System.out.println(sub); 
      for(int i = 0; i<n; i++) { 
       ArrayList<coordinate> a = new ArrayList<coordinate>(sub); 
       a.add(coords.get(i)); 
       ArrayList<coordinate> b = new ArrayList<coordinate>(coords); 
       b.remove(i); 
       permutateSub(a, b); 
      } 
     } 

    } 

Координата - это класс, который имеет только x, y и посещен для хранения двумерных точек для проекта.

В настоящее время я использую этот код для его печати на консоли, но я также был бы признателен, если бы кто-то мог пролить свет на то, как я буду хранить это в ArrayList>. Благодарю.

+0

Похоже, что это может быть дубликатом http://stackoverflow.com/questions/4240080/generating-all-permutations-of-a-given-string – mkobit

+0

Весёлый, Я вижу декларацию метода 'permutateSub', как будто он должен возвращать объект' ArrayList > ', но я не вижу' return' в любом месте кода функции. –

+0

Ой, моя ошибка. Несмотря на это, он все равно вернет более короткие перестановки. – AHalbert

ответ

3

Вот один из способов сделать это:

public static void permutation(List<coordinate> nums) { 
    List<List<coordinate>> accum = new ArrayList<List<coordinate>>(); 
    permutation(accum, Arrays.<coordinate>asList(), nums); 
    System.out.println(accum); 
} 

private static void permutation(List<List<coordinate>> accum, List<coordinate> prefix, List<coordinate> nums) { 
    int n = nums.size(); 
    if (n == 0) { 
     accum.add(prefix); 
    } else { 
     for (int i = 0; i < n; ++i) { 
      List<coordinate> newPrefix = new ArrayList<coordinate>(); 
      newPrefix.addAll(prefix); 
      newPrefix.add(nums.get(i)); 
      List<coordinate> numsLeft = new ArrayList<coordinate>(); 
      numsLeft.addAll(nums); 
      numsLeft.remove(i); 
      permutation(accum, newPrefix, numsLeft); 
     } 
    } 
} 
+0

Просто, чтобы упомянуть об этом, это использует функции Java 8. –

+0

Спасибо за вклад! Однако они не являются списками целых чисел, они являются списками координат. Таким образом, появляется несколько ошибок, связанных с List. – AHalbert

+0

Вы можете просто найти и заменить 'Integer' на' coord' – janos

4

Взгляните на Collections2 permutations метод гуавы в.

Пример (source)

public void permutations() { 
    List<Integer> vals = Ints.asList(new int[] {1, 2, 3}); 

    Collection<List<Integer>> orderPerm = Collections2.permutations(vals); 

    for (List<Integer> val : orderPerm) { 
     logger.info(val); 
    } 
} 

/* output: 
[1, 2, 3] 
[1, 3, 2] 
[3, 1, 2] 
[3, 2, 1] 
[2, 3, 1] 
[2, 1, 3] 
*/ 
+1

+1: Не нужно изобретать велосипед. В любом случае, Гува будет полезен во многих ситуациях. –

+0

В будущем я обязательно воспользуюсь этим. Огромное спасибо. – AHalbert

Смежные вопросы