【问题标题】:Adding an element to an ArrayList in the correct postition将元素添加到正确位置的 ArrayList
【发布时间】:2011-04-06 03:22:42
【问题描述】:

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

        }
      }

【问题讨论】:

  • List 有一个 contains(Object o) 方法,可以执行您的循环正在执行的操作。它使代码更简单。
  • 提示:插入排序 (en.wikipedia.org/wiki/Insertion_sort)
  • 哪部分不明白?我们不应该为你做功课。 :) 你必须在考试时间知道这些东西。
  • 使用 == 意味着完全相同的对象在列表中,而不是两个对象相等。使用 .equals(对象 o)。 -- 或者只使用 contains(Object o)
  • 1) 我假设您有一个扩展 ArrayList 的类。 2)您要添加的项目是什么?你如何比较/排序它们?

标签: java arraylist comparator comparable


【解决方案1】:

一种方法是先检查是否

myArrayList.contains(item)

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

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

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

【讨论】:

  • 感谢您的意见。我将重复检查更改为使用 contains() 方法。我其实早有过。唯一的问题是我需要先插入它的方法,而不必对其进行排序。调用方法后它应该保持排序。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在正确的位置添加一个元素与没有做binary search并记录你最后比较的位置是一样的。

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

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

      【讨论】:

        猜你喜欢
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多