我只是想知道是否可以将我从头创建的数据结构(在我的情况下是一组)转换为列表。
我已经阅读过(在互联网上和此处)并看到可以通过执行以下操作将一个集转换为一个列表:
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?
答案 0 :(得分:2)
根据javadoc,ArrayList
的构造函数需要一个实现Collection
接口的对象。因此,您可以使用Set class
实现Collection接口。
但是,这样做意味着你必须实现很多方法。如果您不想这样做,那么java已经提供了AbstractCollection类。这是javadoc所读的内容:
此类提供Collection的骨架实现 接口,以最小化实现此操作所需的工作量 接口
因此,您可以Collection
AbstractCollection类而不是实现extend
接口,而只覆盖iterator
和size
方法。
答案 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;
}