鉴于这是作业,我将尝试为您提供答案的背景。
解决这个问题的关键是使用递归。
首先假设您的数组中有两个项目。你可以删除第一个项目给你你的第一个组合。将剩余的项目添加到第一个项目为您提供第二个组合。删除第二个项目会给你第三个组合。添加剩余项目为您提供第四种组合。如果你有["air", "bus"],它会是这样的:
["air"]
["air", "bus"]
["bus"]
["bus", "air"]
返回的方法可能如下所示:
String[][] combinations(String[] strings)
需要注意的重要事项是可以将包含单个字符串的数组传递给此方法,并且它可以返回一个包含包含单个字符串的数组的数组。
这个问题有点复杂,因为你必须对字符串组合进行计数,所以在我们解决这个问题之前,了解递归很重要。
假设您想编写一个乘法方法,它接受两个数字并将它们相乘,但您只能使用加法和减法。您可以编写一个递归函数,将其中一个数字添加到自身,直到另一个数字达到退出条件,例如:
public int multiply(int value1, int value2)
{
if (value1 > 1)
{
int remaining = value1 - 1;
return value2 + multiply(remaining, value2);
}
else
{
return value2;
}
}
你可以对数组做同样的事情,只是当a值命中1时退出你在数组包含一个项目时退出,比如:
public String[][] combinations(String[] strings)
{
if (strings.length > 1)
{
...
}
else
{
return new String[][]{strings};
}
}
由于 Java API 的原因,使用 java.util.List 比使用数组更容易,因此您需要以下内容:
public List<List<String>> combinations(List<String> strings)
{
if (strings.size()> 1)
{
...
}
else
{
List<List<String>> result = new ArrayList<List<String>>();
result.add(strings);
return result;
}
}
现在,... 才是最重要的。您需要保留一个列表列表作为结果并遍历strings。对于每个字符串,您可以将该字符串添加到结果中,然后您需要创建一个减去当前字符串的子列表,您可以使用该子列表再次调用combinations 方法,再次遍历结果,添加当前字符串每个列表它包含了。在代码中它看起来像:
public List<List<String>> combinations(List<String> strings)
{
if (strings.size() > 1)
{
List<List<String>> result = new ArrayList<List<String>>();
for (String str : strings)
{
List<String> subStrings = new ArrayList<String>(strings);
subStrings.remove(str);
result.add(new ArrayList<String>(Arrays.asList(str)));
for (List<String> combinations : combinations(subStrings))
{
combinations.add(str);
result.add(combinations);
}
}
return result;
}
else
{
List<List<String>> result = new ArrayList<List<String>>();
result.add(new ArrayList<String>(strings));
return result;
}
}
总之,您所做的是将字符串列表缩减为单个项目,然后将其与前面的项目组合以在线程返回调用堆栈时生成所有可能的组合。