将自定义集数据结构转换为列表java

时间:2017-03-13 20:16:58

标签: java list data-structures collections set

我只是想知道是否可以将我从头创建的数据结构(在我的情况下是一组)转换为列表。

我已经阅读过(在互联网上和此处)并看到可以通过执行以下操作将一个集转换为一个列表:

Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);

List<Integer> list = new ArrayList<Integer>(set);

但我想知道是否可以在不使用HashSet的情况下执行此操作,因为我已经创建了自己的不可变Set数据结构(我有一个名为Set的抽象类,一个定义Empty集的类和一个定义具有元素的集合的类,或者如果不可能的话。

在我的课堂上,我有一个名为toList()的方法,我试图将其实现为:

public List<T> toList() {
   return new ArrayList(this);
}

我认为在程序中使用时,它可以像上面的方法那样使用集合并制作它的列表版本。

但是我意识到我的设置不是HashSet<Integer>它会Empty<Integer>给我一个问题。它说构造函数是未定义的,这是可以理解的,因为它是一个&#34; custom&#34; class等等java.util.ArrayList不适合这个。

所以我的问题是:有没有办法将这个不可变数据结构从一组Empty转换为ArrayList,或者我应该使用HashSet?

5 个答案:

答案 0 :(得分:2)

根据javadocArrayList的构造函数需要一个实现Collection接口的对象。因此,您可以使用Set class实现Collection接口。

但是,这样做意味着你必须实现很多方法。如果您不想这样做,那么java已经提供了AbstractCollection类。这是javadoc所读的内容:

  

此类提供Collection的骨架实现   接口,以最小化实现此操作所需的工作量   接口

因此,您可以Collection AbstractCollection类而不是实现extend接口,而只覆盖iteratorsize方法。

答案 1 :(得分:0)

如果您的自定义集实现了java.util.Collection接口,则可以使用构造函数。

public ArrayList(Collection<? extends E> c)

答案 2 :(得分:0)

如果您已定义自定义Set类以实现Collection接口,那么您可以执行您要执行的操作。基本上,您可以看到Java标准库中的所有集合都实现了该接口。如果你实现了那个接口,Arraylist也可以使用新的ArrayList构造函数。

https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html

顺便说一下,你所要做的就是实现toArray()方法,以获得新的ArrayList&lt;&gt;上班。您可以将其余部分保留为未实现 https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#toArray--

答案 3 :(得分:0)

您的自定义集数据结构需要实现Collection,以便被ArrayList的构造函数接受。

根据ArrayList documentation

  

ArrayList(Collection c)   构造一个包含指定集合元素的列表,按顺序,它们由集合的迭代器返回。

一种简单的方法是扩展已经实现AbstractCollection接口的Collection

class CustomSet extends AbstractCollection {

    @Override
     public size() {
      // your implementation
      }

    @Override
     public iterator() {
      // your implementation
      }
    }

答案 4 :(得分:0)

为什么不创建一个空的ArrayList并将所有元素添加到它?

public List<T> toList() {
    List<T> list = new ArrayList<>();
    forEach(list::add);
    return list;
}