使用Comparator和Iterator,我尝试按顺序将对象添加到链接列表中。到目前为止,我有以下内容:
public class ComparatorClass implements Comparator<Integer> {
public int compare(Integer int1, Integer int2) {
return int1.compareTo(int2);
}
}
和
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
public class OrderedListInheritance implements LinkedList {
ArrayList<Object> myList = new ArrayList<Object>();
Comparator comp = new ComparatorClass();
OrderedListInheritance(Comparator c) {
this.comp = c;
}
@Override
public void add(Object o) {
addLast(o);
}
@Override
public void addAtIndex(int index, Object o) {
Iterator it = getIterator();
while (it.hasNext()) {
Object element = it.next();
if (comp.compare(element, o) < 0) {
}else if (comp.compare(element, o) == 0) {
}else{
myList.add(o);
}
}
}
@Override
public void addFirst(Object o) {
addAtIndex(0, o);
}
@Override
public void addLast(Object o) {
addAtIndex(myList.size(), o);
}
@Override
public Object get(int index) {
return myList.get(index);
}
@Override
public Iterator getIterator() {
Iterator iter = myList.iterator();
return iter;
}
@Override
public int indexOf(Object o) {
return myList.indexOf(o);
}
}
我不确定如何将Iterator与比较器结合使用,以便按顺序将每个元素添加到链接列表中。有人可以帮我解释逻辑吗?
答案 0 :(得分:3)
你的比较器错了。
比较器的一般合同的一部分是,如果compare(a, b)
为正,compare(b, a)
为负。
如果您传入的比较器不符合比较器合约,您将会得到未定义的行为。
答案 1 :(得分:1)
如果实现add
方法以按排序顺序插入元素(或除列表末尾之外的任何位置),则违反了List
接口的约定。从语义上讲,它不是List
,将它传递给任何期望的代码是不安全的。假装实现List
界面只会导致麻烦。
如何使用TreeSet
?代替?
Set<Integer> list = new TreeSet<Integer>();
当然,Set
不允许重复元素。
如果你想要一些允许重复的东西,但仍然允许有效的有序检索,试试一个基于堆的集合,比如PriorityQueue
.
答案 2 :(得分:0)
是否有任何理由不能使用普通ArrayList
,然后拨打Collections.sort(list)
或Collections.sort(list, comparator)
?
答案 3 :(得分:0)
我会这样写:
public class IntegerComparator
implements Comparator<Integer>
{
public int compare(final Integer a, final Integer b)
{
return (a.compareTo(b));
}
}
我打算在代码上发表更多评论......但是你所提供的内容将无法正常工作......你声明了一个ArrayList,但是后来想要使用一个Comparator并且你没有投射......所以赢得了'编译。
另一个问题是你不应该使用== 1你应该使用&lt; 0和&gt; 0,因为比较器可能不返回1,0,-1,但也可以返回其他数字。你也没有处理所有情况a&lt; b,a == b,a&gt;湾
答案 4 :(得分:0)
我们在做功课吗?您的问题似乎与比较器接口没有那么多,因为它清楚地了解您希望它做什么。这听起来像是一个倡导测试驱动开发风格的完美场所。首先编写测试以插入空列表,插入列表的头部,插入尾部,插入长度为2的列表中间。然后编写测试以返回第n个元素和元素给定的价值。在这些简单的情况工作之后,很容易在有序列表中找到元素,该元素是第一个大于要插入的元素的元素,并在较大的元素前面添加元素。不要忘记添加重复值的边缘情况,小于列表中任何值的值以及大于列表中任何值的值。