将元素添加到数组列表的正确位置



我有一个自定义的ArrayList接口,它扩展了Comparable类,并按升序排列。我正在编写的类正在实现这个接口。

我的问题是我需要编辑add方法,以便它将添加一个元素到ArrayList,让列表保持有序,并确保没有重复。

用不同的方法来做这些事情很容易,但这是不可能的。我需要一个方法来完成所有的工作,这样当调用该方法时(只要它不是重复的),元素就会被添加到正确的位置。

最重要的是,为了检查要插入方法的索引的位置,我必须使用从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;
        }
      }

一种方法是首先检查

myArrayList.contains(item)

如果没有,就插入并重新排序你的数组:

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

注意,一般来说,如果你想维护一个没有重复项的有序集合,有比ArrayList更好的数据结构。

TreeSet呢?它似乎有你正在寻找的行为

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

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

在正确位置添加元素与未进行二进制搜索并记录上次比较的位置相同。

查看Arrays.binarySearch的文档。希望这将提供足够的信息来实现它。comparable的实现应该与排序的实现相同。以下是文档中的相关节选:

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

相关内容

  • 没有找到相关文章

最新更新