【问题标题】:How to convert List<List<T>> to Set<Set<T>>? [duplicate]如何将 List<List<T>> 转换为 Set<Set<T>>? [复制]
【发布时间】:2016-09-28 18:01:47
【问题描述】:

我需要创建将返回数组列表排列的方法。我使用了this 方法,但它返回List&lt;List&lt;T&gt;&gt;,我需要获取Set&lt;Set&lt;T&gt;&gt; 类型。谁能帮我实现这个目标?

编辑:我试过了:

public Set<Set<T>> permute() {
        List<List<T>> tmp = generatePerm(this);
        Set<Set<T>> tmpSet = new HashSet<>();
        for (List<T> el : tmp){
            tmpSet.add(new HashSet<T>(el));
        }
        return tmpSet;
    }

但它只返回一个排列。

解决方案:

好的,我明白了。这个方法在扩展 ArrayList 的类中,所以我简单地将 Set&lt;T&gt; 实现到这个类,并将这个方法的返回类型更改为 XList&lt;Set&lt;T&gt;&gt; 并且它起作用了。

【问题讨论】:

  • 问题实际上是Set的实现和目的。例如,HashSet 没有重复项,也没有排序。因此,您排列的所有 HashSet 彼此相等。这就是为什么你的结果(在你的样本中)只有一个排列。
  • 但这是我大学的一项任务,所以必须有一种方法来完成它。我无法更改返回类型。

标签: java arrays set permutation


【解决方案1】:

你不能这样做,因为集合实际上是一个无序列表(集合)。此外,创建排列需要顺序。结果,即使我们假设这是可能的,你每次都会得到相同的集合,所以你会有 n 个等价的集合。

【讨论】:

  • 那么有什么方法可以实现我的目标并获得Set&lt;Set&lt;T&gt;&gt; 类型?
  • @MarcinRejnowski 我猜你可以在 foreach 风格的 for 循环中使用 LinkedHashSet 而不是 HashSet。 LinkedHashSet 介于链表和哈希集之间(它仍然实现 Set )。它还可以记住元素的插入顺序,从而为您提供排列。所以你可以做类似for (List&lt;T&gt; el : tmp){ tmpSet.add(new LinkedHashSet&lt;T&gt;(el)); }的事情。
猜你喜欢
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2019-04-13
相关资源
最近更新 更多