【问题标题】:How to make subsets for an item in a list elements combining the other items from the list?如何为列表元素中的项目创建子集,并结合列表中的其他项目?
【发布时间】:2012-06-22 15:50:40
【问题描述】:

假设我有一个 ArrayList 的字符串,例如 [a, b, c, d, ....]。任何人都可以帮助我提供一个示例代码,我怎样才能得出一个包含此列表中所有可能的功率子集的结果,其中包括该列表中的特定字符串(单个和空子集除外)?

例如:如果我想从示例列表中获取包括a 在内的所有功率子集,那么输出将是:

[a,b], [a,c], [a,d], [a,b,c], [a,b,d], [a,c,d] without the empty and single subset([a])

同样,如果我想要b,那么输出将是:

[b,a], [b,c], [b,d], [b,a,c], [b,a,d], [b,c,d] without the empty and single subset([b])

由于示例列表中的所有项目都是字符串,因此当子集太丰富时,它们可能是内存问题。因为我需要一次将这些子集保存在内存中以保存一个字符串。就像为a 制作子集时一样,我需要这些子集进行进一步处理,然后删除它们,然后为b 等等。因此,我还需要有关此场景的优化解决方案的帮助?

我需要 Java 方面的帮助。由于我不太擅长Java,如果我犯了任何错误,请原谅我!

【问题讨论】:

  • 添加了homework标签,因为我最近看到了一些与此非常相似的问题,您是新用户,没有人需要编写代码来做到这一点在现实世界中

标签: java memory-management collections subset


【解决方案1】:

如果总是只有一个特定元素,我建议从源集合中删除目标元素,在剩余集合上使用 Guava 的 Sets.powerSet,然后将目标元素添加到返回的集合中。比如……

Set<String> elems = Sets.newHashSet(set);
elems.remove(target);
Set<Set<String>> powerSet = Sets.powerSet(elems);
Collection<Set<String>> subsetsWithTarget = Collections2.transform(
    powerSet, new Function<Set<String>, Set<String>>() {
  public Set<String> apply(Set<String> setWithoutTarget) {
    return Sets.union(setWithoutTarget, Collections.singleton(target));
  }
});

(披露:我为 Guava 做出了贡献。)

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 2014-05-28
    • 2019-05-25
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多