从可比数组中删除项目

remove item from comparable array

我是 java 的新手,我的第一个问题是 Comparable 是什么东西?在我的示例代码中,为什么 Class Bag<T extends Comparable<T>>?目的是什么?

我的第二个问题是如何从这个 Comparable 数组中删除一个项目。我已经编写了 removeMin 方法,我找到了项目,我将变量命名为 "min",我如何继续并从 arrayList 中删除这个最小项目?非常感谢!

这是部分代码:

public class Bag<T extends Comparable<T>> implements Iterable<T> {
    private int MAX_ITEMS = 10; // initial array size
    private int size;
    private Comparable[] data;

    public Bag( ) {
        //data = (Comparable []) new Object[MAX_ITEMS];
        data = (T []) new Comparable[MAX_ITEMS];
        size = 0;
    }

      public Comparable removeMin(){
          Iterator<T> iterator=iterator();
          T min = iterator.next();
          while (iterator.hasNext())
          {  
             T next = iterator.next();
             if (min.compareTo(next) > 0) 
                min = next;
                ****************************************************
                How to remove this min item? 
                ****************************************************
                }
          return min;
          }

what is this Comparable thing

用最简单的术语来说,它指定了如何将项目相互比较。例如,在您的情况下,您的 class Bag 可能包含任何项目,因此您使用了通用类型 T 但您希望您的项目也可以相互比较,因此您使用 T extends Comparable<T>

Comparable 接口有一个方法compareTo用来比较项目。您可以在 JLS 中阅读更多相关信息。

现在您可能想知道为什么我需要比较项目? 想象一下,如果您无法比较,那么您怎么能说 51 大,或者为什么 A 在字母表中排在 B 之前。他们这样做是因为我们对他们有一些订单,然后我们可以根据他们进行比较。同样,您可能希望包中的物品具有可比性。

how to remove an item from this Comparable array

要遍历您似乎已经使用的项目 iterator

 Iterator<T> iterator=iterator();
 T min = iterator.next();

如果项目符合您的条件,您可以使用相同的迭代器删除该项目。所以你的代码应该是iterator.remove()。但是你也应该确保在所有相关地方进行空检查和存在检查

java.lang.Comparable接口。 <T extends Comparable<T>> 是一个通用类型,在编译时 Java 将要求实例提供 int compareTo(T o) 的实现,其中(来自 Javadoc)returns 负整数、零或正整数,因为此对象小于、等于或大于指定对象。 此外,您可以用 [= 支持您的 Bag 15=](而不是数组),如

class Bag<T extends Comparable<T>> implements Iterable<T> {
    private List<T> al = new ArrayList<>();

    public Bag() {
        super();
    }

    public T removeMin() {
        Iterator<T> iterator = iterator();
        T min = iterator.hasNext() ? iterator.next() : null;
        while (iterator.hasNext()) {
            T next = iterator.next();
            if (min.compareTo(next) > 0) {
                min = next;
            }
        }
        if (min != null) {
            iterator = iterator();
            while (iterator.hasNext()) {
                T next = iterator.next();
                if (min.compareTo(next) == 0) {
                    iterator.remove();
                    break;
                }
            }
        }
        return min;
    }

    @Override
    public Iterator<T> iterator() {
        return al.iterator();
    }
}

请注意 Iterator.remove()(部分)如果在迭代过程中以除调用此方法以外的任何方式修改基础集合,则迭代器的行为未指定.

实现可比接口是为了定义与您的自定义类型的比较机制。 数组的大小通常是固定的,所以你不能只删除一个项目而不将剩余的项目复制到一个新数组。我建议将您的数组更改为动态列表:

public class Bag<T extends Comparable<T>> implements Iterable<T> {
    private int size;
    private LinkedList<T> data;

    public Bag() {
        data = new LinkedList<T>();
        size = 0;
    }

    public Comparable removeMin() {
        Iterator<T> iterator = iterator();
        T min = iterator.next();
        while (iterator.hasNext()) {
            T next = iterator.next();
            if (min.compareTo(next) > 0)
                min = next;
            data.remove(min);
        }
        return min;
    }

}

What is this Comparable thing?

它是一个通用接口,可以由 classes 实现,您需要能够相互比较其实例。 Comparable<T> 有一个方法 int compareTo<other T>。该方法的实现应该将 thisother 实例

进行比较

In my sample code, why class Bag<T extends Comparable<T>>? What's the purpose?

这表示您的 Bag class 是具有类型参数 T 的泛型 class。 T extends Comparable<T> 位表示 T 必须是实现 Comparable<T>.

的某些 class

My second question is how to remove an item from this Comparable array.

根据您对数组工作原理的了解,您可以自己弄清楚。您必须处理的最大限制是数组的大小无法更改,因此没有神奇的操作可以简单地从数组中间删除一些内容。

有两种方法:

  • 创建一个仅包含您不想删除的元素的新数组。 (提示:复制它们)

  • 在概念上删除元素时,将现有数组中的元素移动到 "fill the hole" 左侧。 (提示:注意 size 字段。它有什么用?)

假设您是从头开始编写 removeMin 方法,我认为您尝试在那里使用迭代器已经走入了死胡同1。尝试对其进行编码以直接在 data 数组上进行操作。

removeMin 问题有两部分:

  1. data中找到最小元素的索引
  2. 删除该索引处的元素

提示:第一部分要求您查看每个元素...并且必须完成 你做删除之前。这应该反映在您的代码中。


1 - 如果您使用的是 ArrayList<T> 或类似的,那么使用 data.iterator() 将是一个合理的选择。问题是数组不直接支持 Iterable API.

现在,如果您需要制作 Bag class 工具 Iterable<T>,那么您 可以 使用您为此目的在 removeMin 方法中实现的迭代机制。但即使在那里,API 也不是理想的用途。您仍然需要迭代集合两次。一次找到最小的元素,第二次将其删除。通过迭代器删除意味着迭代器需要实现 optional Iterator.remove() 方法....这会让你回到原点。