2016-11-07 42 views
-1

我对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); 
    } 
    } 
} 
+0

“我尝试过滤或.remove”请在您的代码中显示。 –

回答

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<>()); 
    } 
} 
+0

当我尝试使用您的代码时,它说数组无法解析,并且List无法解析为某个类型。如果我使用排列,集合或列表,这并不重要。我只想实现创建6个元素长度的组合并过滤掉诸如2,3,4,5,6,7和1,3,4,5,6,8的证书组合的结果。 –

+0

您需要添加导入语句才能访问这些类。 – sprinter

0

你在正确的轨道上。我注意到的一件事是,在您的main方法中,您可以使用行combinations2(arraylist, 6, 0, new String[6]);来调用combinations2方法。我想知道为什么你可能会将你的结果存储在一个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)*)。

+0

你建议的作品,但它删除了6元素格式。我想保留我的格式,但删除了我不想保留的特定组合。我不知道如何从你在这里给我看的东西实现这一点。 –

+0

您能否解释更多,或者在原始帖子的示例之前/之后进行编辑?与System.arraycopy相比,特定的组合可能会更好地处理Collections。 –