我是Java的初学者,请建议在Java中用哪些集合(集合)来维护有序列表。我尝试过 Map 和
Set ,但它们不是我想要的。
我是Java的初学者,请建议在Java中用哪些集合(集合)来维护有序列表。我尝试过 Map 和
Set ,但它们不是我想要的。
虽然有些晚,但JDK中有一个专门用于排序列表的类。它被命名为(与其他Sorted*
接口略有不同)"java.util.PriorityQueue
"。它可以使用Comparable<?>
或使用Comparator
进行排序。
与使用Collections.sort(...)
排序的List
的区别在于,PriorityQueue
将始终保持部分顺序,并且通过使用堆数据结构具有O(log(n))的插入性能,而在已排序的ArrayList
中插入将是O(n)(即使用二进制搜索和移动)。
但是,与List
不同的是,PriorityQueue
不支持索引访问(get(5)
),访问堆中的项目的唯一方法是一个一个地取出(因此称为PriorityQueue
)。
TreeMap 和 TreeSet 将以排序顺序迭代内容。或者您可以使用 ArrayList 并使用 Collections.sort() 进行排序。所有这些类都在 java.util 中。
List
必须始终在末尾添加的要求,给你点赞。 - Roland Illig有几种选择。如果你不想要重复项并且插入的对象是可比较的,我建议使用TreeSet。
您也可以使用Collections类的静态方法来实现此目的。
有关更多信息,请参见Collections#sort(java.util.List)和TreeSet。
public class ContactList implements List<Contact>, Serializable {
private static final long serialVersionUID = -1862666454644475565L;
private final List<Contact> list;
public ContactList() {
super();
this.list = new ArrayList<Contact>();
}
public ContactList(List<Contact> list) {
super();
//copy and order list
List<Contact>aux= new ArrayList(list);
Collections.sort(aux);
this.list = aux;
}
public void clear() {
list.clear();
}
public boolean contains(Object object) {
return list.contains(object);
}
我已经实现了一种新的方法"putOrdered",如果元素不存在,则将其插入到适当的位置,如果存在,则进行替换。
public void putOrdered(Contact contact) {
int index=Collections.binarySearch(this.list,contact);
if(index<0){
index= -(index+1);
list.add(index, contact);
}else{
list.set(index, contact);
}
}
public void addOrdered(Contact contact) {
int index=Collections.binarySearch(this.list,contact);
if(index<0){
index= -(index+1);
}
list.add(index, contact);
}
如果你想避免插入操作,也可以在“add”和“set”方法上抛出不支持的操作异常。
public boolean add(Contact object) {
throw new UnsupportedOperationException("Use putOrdered instead");
}
...同时,您需要注意ListIterator方法可能会修改您的内部列表。在这种情况下,您可以返回内部列表的副本或再次引发异常。
public ListIterator<Contact> listIterator() {
return (new ArrayList<Contact>(list)).listIterator();
}
List
契约。也许只实现Collection
会更好。如果ContactList
已排序,则可以使用binarySearch
实现contains()
以提高效率。 - Marcono1234TreeSet无法使用,因为它们不允许重复的元素,并且它们没有提供获取特定位置元素的方法。PriorityQueue也无法使用,因为它不允许获取特定位置的元素,这是列表的基本要求之一。
我认为你需要在Java中实现自己的算法来维护一个排序列表,其插入时间为O(logn),除非你不需要重复的元素。也许一个解决方案是使用TreeMap,其中键是item子类,覆盖equals方法,以便允许重复的元素。