我正在创建一个实现List的SortedList类。
如果我理解正确,方法toArray(T [] a)将一个对象数组作为参数,并返回这些对象的有序数组。
在java文档中,我们可以看到,如果Collection长度大于sortedList,则创建一个具有良好大小的新数组,如果集合长度小于sortedList,则该对象跟在最后一个对象之后collection设置为null。
我正在处理的项目不允许我在排序列表中使用空值,所以我使用新的sortedList和toArray()方法以不同方式实现该方法:
public <T> T[] toArray(T[] a)
{
SortedList sort = new SortedList();
for(Object o : a)
{
sort.add(o);
}
return (T[])sort.toArray();
}
这是一种实现此方法的好方法,还是我希望错误使用它?
感谢您的时间。
答案 0 :(得分:1)
您确定需要实施List
。实施Iterable
和Iterator
。
public class SortedList<S extends Comparable<S>> implements Iterable<S>, Iterator<S> {
private final Iterator<S> i;
// Iterator version.
public SortedList(Iterator<S> iter, Comparator<S> compare) {
// Roll the whole lot into a TreeSet to sort it.
Set<S> sorted = new TreeSet<S>(compare);
while (iter.hasNext()) {
sorted.add(iter.next());
}
// Use the TreeSet iterator.
i = sorted.iterator();
}
// Provide a default simple comparator.
public SortedList(Iterator<S> iter) {
this(iter, new Comparator<S>() {
public int compare(S p1, S p2) {
return p1.compareTo(p2);
}
});
}
// Also available from an Iterable.
public SortedList(Iterable<S> iter, Comparator<S> compare) {
this(iter.iterator(), compare);
}
// Also available from an Iterable.
public SortedList(Iterable<S> iter) {
this(iter.iterator());
}
// Give them the iterator directly.
public Iterator<S> iterator() {
return i;
}
// Proxy.
public boolean hasNext() {
return i.hasNext();
}
// Proxy.
public S next() {
return i.next();
}
// Proxy.
public void remove() {
i.remove();
}
}
然后您可以执行以下操作:
for ( String s : new SortedList<String>(list) )
通常都是您想要的,因为TreeSet
为您提供排序。
答案 1 :(得分:1)
如果要实现“SortedList”类,那么在内部维护排序列表可能符合您的最佳利益,而不是依靠toArray()
方法在出路时对它们进行排序。换句话说,该类的用户可能不使用toArray()
方法,而是可以使用listIterator()
返回一个迭代器,该迭代器应该以正确的顺序迭代列表的元素。
答案 2 :(得分:1)
首先推荐:
如果您希望SortedList
实施List
界面,最好扩展AbstractList
而不是直接实施List
。 AbstractList
已经定义了许多必要的方法,包括你遇到问题的方法。 Java平台库中的大多数List
- 实现也扩展了AbstractList
。
如果你仍想直接实现List
,那么这个方法应该是这样做的:
让a
成为指定的数组。
a
足够大,请使用SortedList
中的元素(按照正确的顺序)填写它,而不必关心a
之前的内容。a
有空余空间,请设置a[size()] = null
。然后,除非列表包含null
- elements。a
,请创建一个与列表大小相同的T
类型的新数组,并填充新的数组。a
,请返回a
。如果您创建了一个新数组,则返回新数组。这种方法有用的原因有两个:
Object
类型,而是由用户决定的类型T
(只要类型有效)。Here是Java Docs描述该方法的方式。