我有一个自定义的ArrayList接口,它扩展了Comparable类并按升序排列。我正在研究的课程是实现这个界面。
我的问题是我需要编辑add方法,以便它将元素添加到ArrayList,使List保持有序,并确保没有重复。
在单独的方法中完成所有这些操作会很容易,但这不是问题所在。我需要一个方法来完成所有操作,这样当调用方法时,(只要它不是重复的)元素就会被添加到正确的位置。
最重要的是,要检查索引的位置以插入方法,我必须使用从Comparable类继承的compareTo()方法。唯一的问题是我必须在我正在处理的类中实现我自己的compareTo()方法。我已经看了很多,而且我很困惑如何为这个特定的课程去做。
到目前为止,这是我的代码:
public void add(E item) throws IndexOutOfBoundsException {
if (contains(item)) {
throw new IllegalArgumentException("This is a duplicate!");
}
//here is where I need the implementation to add the item to the array, in order
}
然后这是我的compareTo()方法:
public int compareTo(E item) {
if () {
return -1;
}
else if () {
return 1;
}
else {
return 0;
}
}
答案 0 :(得分:2)
执行此操作的一种方法是先检查是否
myArrayList.contains(item)
然后如果没有,只需插入并重新排序数组:
myArrayList.add(item);
Collections.sort(myArrayList);
请注意,通常情况下,如果要维护没有重复项的有序集,则存在比ArrayList
更好的数据结构。
答案 1 :(得分:0)
TreeSet怎么样?它似乎有你正在寻找的行为。
答案 2 :(得分:0)
你没有提供那么多信息。如果您真正实现的是类似数据结构的ArrayList,那么首先需要查看数组是否足够大以添加新项。如果没有,则需要创建一个新数组。在第一种情况下,您需要找到输入新元素的位置,从该位置向下移动所有内容,然后添加元素。对于第二种情况,您可以将旧列表与新元素“合并”(即,继续从旧列表添加,直到新元素应该出现的位置,添加新元素,然后继续)。我有另一个问题:compareTo(Object o)放在哪里?如果你要放入ArrayList类,那就没那么没用,因为你真的不想比较数组。如果它存储在ArrayList中的类中,如果 this 对象在传入的对象之前出现,则返回-1,如果此对象出现,则返回-1之后,如果它们相等则为0。如果您可以选择数据结构,则可能需要考虑链接列表:它们很容易添加和删除。
如果要扩展ArrayList类,那么这是超级(双关语)容易。在你的add方法中,你必须确定添加元素的位置,然后调用super.add(int loc)方法
答案 3 :(得分:0)
在正确位置添加元素与未执行binary search并记录您比较的最后位置相同。
查看Arrays.binarySearch的文档。希望这将提供足够的信息来实现它。您的可比较实现应该与您用于排序的实现相同。以下是文档中的相关摘录:
搜索键的索引,如果它包含在数组中;否则,( - (插入点) - 1)。插入点定义为键将插入到数组中的点:第一个元素的索引大于键,或者如果数组中的所有元素都小于指定键,则为a.length。请注意,当且仅当找到密钥时,这可以保证返回值>> =。