如何使这种组合/排列方法递归?

2024-01-04

我有一个字符串数组列表,希望将所有可能的组合存储到另一个集合中。

例如:

[air,bus,car]
->
[air]
[bus]
[car]
[air,bus]
[air,car]
[bus,air]
[bus,car]
[car,air]
[car,bus]
[air,bus,car]
[air,car,bus]
...
[car,bus,air]

重复并不重要。我现在的代码是:

public ArrayList<String> comb(ArrayList<String> wrds, ArrayList<String> str, int size)
{
    ArrayList<String> s = new ArrayList<String>();
    s.addAll(str);
    if(size != a1.size())
    {
        Iterator e = a1.iterator();
        while(e.hasNext())
        {
            s.add((String)e.next());
        }
        size++;
    }
}

我试图让它递归地调用自身,以便它可以存储组合。我可以获得有关代码中缺少的位置或部分的帮助吗?


鉴于这是家庭作业,我将尽力向您提供答案的背景。

解决这个问题的关键是使用递归。

首先假设您的数组中有两个项目。您可以删除第一个项目来获得第一个组合。将剩余的项目添加到第一个项目中即可得到第二个组合。删除第二个项目就会得到第三个组合。添加剩余的项目将得到第四种组合。如果你有["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;
  }
}

总之,您所做的是将字符串列表减少为单个项目,然后将其与前面的项目组合,以在线程返回调用堆栈时生成所有可能的组合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使这种组合/排列方法递归? 的相关文章

  • 简单 XML 框架:ElementMap 中的对象具有“类似内联”的行为

    我正在尝试在 Android 上序列化自定义对象的 Hashmap 以获得如下 xml
  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • H2数据库:如何进行加密保护,而不暴露文件加密密钥

    我们在服务器模式下使用Java H2数据库 因为我们不希望用户访问数据库文件 为了对数据库文件添加更多保护 我们计划使用 AES 加密 将 CIPHER AES 添加到数据库 URL 以防存储被盗 但是 每个用户在连接时还需要提供文件保护密
  • 如何避免Eclipse在将类名放在注释中时导入类,以便checkstyle稍后不会抱怨?

    有时我将类名放在方法或类的注释中只是为了引用 但是 Eclipse 会自动执行导入并在文件中留下导入语句 这会导致稍后出现 未使用的导入 检查样式错误 当我在注释中输入类名时 是否可以更改一些配置以避免 Eclipse 自动导入 人们不同意
  • java项目中无法加载类“org.slf4j.impl.StaticLoggerBinder”错误? [复制]

    这个问题在这里已经有答案了 我越来越Failed to load class org slf4j impl StaticLoggerBinder 错误 我想将记录器写入文件 所以我使用了 log4j jar 并使用 apache tomca
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • 我怎样才能限定我不“拥有”的自动装配设置器

    要点是 Spring Batch v2 测试框架具有JobLauncherTestUtils setJob与 Autowired注解 我们的测试套件有多个Job类提供者 由于这个类不是我可以修改的东西 我不确定如何限定它自动连接的作业 每个

随机推荐

  • Perl 诅咒::UI

    我正在尝试使用 Curses UI 库http search cpan org dist Curses UI http search cpan org dist Curses UI 在 Linux karmic 上构建 UI 我可以创建一个
  • 检测 Windows Kit 8.0 和 Windows Kit 8.1 SDK

    我正在为 Windows 平板电脑 Windows Phone 和 Windows 应用商店应用程序编写测试脚本 这些脚本主要适用于 Visual Studio 2012 和 Windows Kit 8 0 SDK Microsoft 似乎
  • Jupyter 笔记本:本地存储的 pdf 文档的超链接在 Chrome 中停止工作

    我有大量的 Jupyter Notebook 其中许多都有指向本地存储的 pdf 文档的超链接 不久前 这些链接在我的 iMac 上的 Chrome 中停止工作 单击链接时 会打开一个带有正确地址的新选项卡 但页面只是黑色 当我在 MacB
  • Squeak/Pharo Web 服务的微框架

    许多语言都有用于编写非常小的网站或 Web 服务的微框架 例如用于 Python 的 Flask 或用于 Ruby 的 Sinatra 在 Squeak 上 似乎没有任何类似的东西 伊利亚特 海边 和 AIDA 都非常重 只是提供了一点服务
  • 如何在vb.net中使用打开文件对话框指定路径?

    在我的应用程序的第一次启动中 我需要指定一个路径来保存一些文件 但在打开文件对话框中 我似乎必须选择要打开的文件 如何只指定文件夹而不打开文件 比如 C config 这是我的代码 If apppath Then Dim fd As Ope
  • 如何使用 SQL 查询更新表中的多行?

    I am new to SQL and C 如屏幕截图所示 我想通过仅插入数量 描述和价格值来更新 订单详细信息 表中的 3 行 订单 3 DataGridView2 我使用 Order Number 和 DateTime 的组合来使订单详
  • Promise.all 与 Firebase DataSnapshot.forEach

    我有几个 HTML 选择 下拉菜单 它们是从名为 states 的 Firebase 节点填充的 见下图 选择城市后 将触发以下函数并检索该城市中发生的所有会议 有一个单独的 会议 节点 每个会议都有各种键 值对 例如街道 时间等 我 认为
  • 使用 jquery 添加新 css 规则的最佳方法?

    我在网页上动态插入一些 html 在检测到用户的事件后 这个 html 需要一些 css 样式 我想知道使用 jQuery 最简洁的方法是什么 我不是网站开发人员 所以我无法将这些规则添加到原始CSS中 假设我已经插入了一些没有样式的 ht
  • django-pagination 可以每页进行多个分页吗?

    如果不能 那么是否有任何其他替代方案 Django 的本机分页或备用包 允许每页多个分页 我想显示大约 5 个对象的列表 每个对象都有自己的分页上下文 为了方便起见 这里是django 分页文档 http pypi python org p
  • 使用消费计划的 Azure 功能的 VNET 集成

    我的 azure 函数正在消耗计划上运行 它需要访问在 Azure VNET 上的 VM 上运行的资源 该资源无法通过 http 公开 除了切换到应用服务计划之外还有其他解决方案吗 目前来看 这是不可能的 VNet 集成功能需要标准 高级或
  • Windows 窗体的每像素碰撞检测算法

    我正在寻找每像素碰撞检测算法 方法Windows 窗体 我已经搜索过了 但只找到了一个 XNA 如下所示 这样的算法不是很符合Windows Forms的概念吗
  • 客户端IP地址的最大长度[重复]

    这个问题在这里已经有答案了 可能的重复 IPv6 地址的文本表示的最大长度 https stackoverflow com questions 166132 maximum length of the textual representat
  • 如何在 UPDATE 语句中使用用户定义的变量?

    我试图回答另一个所以问题 https stackoverflow com questions 18404726并突然面临以下问题 分数应分配给得分最高的 3 个 mrk 组 grp 每个班级 sec 得分最高的组得5分 排名第二的组得3分
  • Hibernate Embedded/Embeddable 不为空异常

    在拥有类中 Embedded private LatLon location 在引用的类中 Embeddable public class LatLon implements Serializable private double lat
  • 使用子查询更新

    我的查询有问题 我有一张巨大的桌子 上面有来自德国的邮政编码 名为 Postleitzahlen 还有另一张名为 Firmen 的公司表 结构是这样的 Firmen ID City State ZipCode Postleitzahlen
  • Tensorflow:在单次运行中分配多个变量值,无需重新计算其他表达式

    我是 Tensorflow 的新手 很抱歉 因为这似乎是一个非常基本的问题 但不幸的是我在 Google 上找不到任何内容 也许我使用了错误的关键字 我有一些从占位符派生的表达式 据我了解张量流的逻辑 以及一些需要在不重新计算 占位符 表达
  • RecyclerView 中的 NullPointEreException

    我尝试从 AsyncTask 中的服务器下载列表并将其放入 recyclerView 中 但是 我仍然在 RecyclerView 上收到 NullPointException 并且不知道为什么 我设置了 LayoutManager 和其他
  • 根据相似度对图像进行聚类

    我面临着基于相似性的图像聚类问题 而不知道聚类的数量 理想情况下 我想实现类似这样的目标http cs231n github io assets cnnvis tsne jpeg http cs231n github io assets c
  • 无法解析相应的jni函数

    我正在制作一个通过串口发送数据的应用程序 这需要从本机库调用方法 我有两个本机方法 打开 关闭 我使用 ndk 生成了 so 库并将它们放入 jnilibs 文件夹中 但仍然给出错误 无法解析相应的 jni 函数 串口 c include
  • 如何使这种组合/排列方法递归?

    我有一个字符串数组列表 希望将所有可能的组合存储到另一个集合中 例如 air bus car gt air bus car air bus air car bus air bus car car air car bus air bus ca