从排列中删除组合

时间:2016-11-07 22:22:17

标签: java arrays string permutation

我对Java和编程相当陌生,并且一直试图找到一种方法来实现我想要做的一段时间。我想从这个字符串数组排列中删除一些组合,例如(1,2,3,4,5,6)或(1,2,3,4,5,7)。我尝试过滤或.remove,但似乎它们不适用于字符串数组。基本上我希望能够过滤掉删除不需要的组合的结果。这是我到目前为止所拥有的。

import java.util.Arrays;

public class Permutations {
  public static void main(String[] args) {

    String[] arraylist = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"};

    combinations2(arraylist, 6, 0, new String[6]);
  }

  static void combinations2(String[] arraylist, int len, int startPosition, String[] result) {

    if (len == 0) {

      System.out.println(Arrays.toString(result));
      return;
    }
    for (int i = startPosition; i <= arraylist.length - len; i++) {
      result[result.length - len] = arraylist[i];
      combinations2(arraylist, len - 1, i + 1, result);
    }
  }
}

2 个答案:

答案 0 :(得分:0)

除非您特别需要使用数组,否则我建议您切换到标准集合。它们易于使用,您不需要传递索引,因为您可以使用子列表。以下代码使用标准contains方法过滤掉不需要的组合。

public class Combos {
    private static final List<List<String>> FILTER = Arrays.asList(
        Arrays.asList("1", "2", "3", "4", "5", "6"),
        Arrays.asList("1", "2", "3", "4", "5", "7"));

    static void combos(List<String> input, List<String> result) {
        if (result.size() == 6) {
            if (!FILTER.contains(result))
                System.out.println(result);
        } else {
            for (int i = 0; i < input.size(); i++) {
                result.add(input.get(i));
                combos(input.subList(i + 1, input.size()), result);
                result.remove(input.get(i));
            }
        }
    }

    public static void main(String[] args) {
        combos(IntStream.rangeClosed(1, 13)
                .mapToObj(Integer::toString)
                .collect(Collectors.toList()), 
                new ArrayList<>());
    }
}

答案 1 :(得分:0)

你走在正确的轨道上。我注意到的一件事是,在main方法中,您使用行combinations2调用combinations2(arraylist, 6, 0, new String[6]);方法。我想知道为什么你可以将结果存储在一个new String[]中,在你调用它之后立即放弃了范围(基本上你没有在这里存储已解析的数组 - 我建议将它存储起来为了有目的地使用它到另一个数组,您可以看到以下代码片段。)。

根据回答这个问题,我会调查System.arrayCopy方法,然后像这样使用它:

public class App {
    public static void main(String[] args) {
        String[] arraylist = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13" };
        System.out.println("arraylist: " + java.util.Arrays.toString(arraylist));
        String[] result= new String[arraylist.length - 6];
        System.arraycopy(arraylist, 6, result, 0, arraylist.length - 6);
        System.out.println("result: " + java.util.Arrays.toString(result));
    } 
}

输出;

arraylist: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
result: [7, 8, 9, 10, 11, 12, 13]

此外,从1.5及更高版本开始,有Arrays.copyOfRange(Object[] src, int from, int to)

但是,如果你没有按顺序删除,那么多次System.arraycopy()调用就会变得相当繁琐/重复(*例如你的第二种情况(1,2,3,4,5,7) )*)。