我对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 :(得分: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) )*)。