2

我有一个自定义 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;

        }
      }
4

4 回答 4

2

一种方法是首先检查是否

myArrayList.contains(item)

然后如果没有,只需插入并重新排序您的数组:

myArrayList.add(item);
Collections.sort(myArrayList);

请注意,一般来说,如果您想维护一个没有重复的有序集合,那么有比ArrayList.

于 2011-04-06T03:36:58.277 回答
0

在正确的位置添加元素与没有进行二分搜索并记录您比较的最后一个位置相同。

查看Arrays.binarySearch的文档。希望这将提供足够的信息来实施它。您对可比较的实现应该与您用于排序的实现相同。以下是文档的相关摘录:

搜索键的索引,如果它包含在数组中;否则,(-(插入点)- 1)。插入点定义为键将插入数组的点:第一个元素的索引大于键,或者如果数组中的所有元素都小于指定的键,则为 a.length。请注意,这保证了当且仅当找到键时,返回值将 >= 0。

于 2011-04-06T08:15:12.150 回答
0

你没有提供那么多信息。如果您真正实现的是类似 ArrayList 的数据结构,那么您首先需要查看数组是否足够大以添加新项目。如果没有,则需要创建一个新数组。在第一种情况下,您需要找到输入新元素的位置,将所有内容从该位置向下移动,然后添加元素。对于第二种情况,您可以将旧列表与新元素“合并”(即,从旧列表继续添加,直到出现新元素应该去的位置,添加新元素,然后继续)。我有另一个问题: compareTo(Object o) 放在哪里?如果您要放入 ArrayList 类,那将毫无意义,因为您真的不想比较数组。如果它在存储在 ArrayList 中的类中,this对象在传入的对象之前,如果this对象在之后,则为 -1,如果它们相等,则为 0。如果你可以选择你的数据结构,你可能需要考虑一个链表:它们很容易添加和删除。

如果您正在扩展 ArrayList 类,那么这非常容易(双关语)。在您的 add 方法中,您必须确定添加元素的位置,然后调用 super.add(int loc) 方法

于 2011-04-06T04:57:12.467 回答
0

TreeSet呢?它似乎具有您正在寻找的行为。

于 2011-04-06T03:29:38.777 回答