我对java很新,我的第一个问题是这个可比较的东西是什么?在我的示例代码中,为什么Class Bag<T extends Comparable<T>>
??目的是什么?
我的第二个问题是如何从此Comparable数组中删除一个项目。我已经写了removeMin方法,我找到了这个项目,我命名变量&#34; min&#34;,我如何继续从arrayList中删除这个min项目?非常感谢!
这里有一些部分代码:
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;
}
答案 0 :(得分:3)
这是什么
Comparable
?
它是一个通用接口,可以由您需要能够相互比较的实例的类实现。 Comparable<T>
只有一种方法int compareTo<other T>
。该方法的实现应该将this
与other
实例
在我的示例代码中,为什么
class Bag<T extends Comparable<T>>
?目的是什么?
这表示您的Bag
类是类型参数为T
的泛型类。 T extends Comparable<T>
位表示T
必须是某个实现Comparable<T>
的类。
我的第二个问题是如何从此Comparable数组中删除一个项目。
根据您对阵列工作原理的了解,您可以找到答案。你必须要处理的一个大约束是数组的大小不能改变,因此没有神奇的操作可以简单地从数组的中间删除一些东西。
有两种方法:
创建一个新数组,其中只包含您不想删除的元素。 (提示:复制它们)
在概念上删除元素时,将现有数组中的元素移动到“填充孔”。 (提示:注意size
字段。它的用途是什么?)
假设您从头开始编写removeMin
方法,我认为您已经在盲目的小巷中尝试使用 1 的迭代器。尝试将其编码为直接在data
数组上运行。
removeMin
问题分为两部分:
data
中找到最小元素的索引提示:第一部分需要你看每个元素......这必须在之前完成你去除。这应该反映在您的代码中。
1 - 如果您使用ArrayList<T>
或类似内容,那么使用data.iterator()
将是一个合理的选择。问题是数组不直接支持Iterable
API。
现在,如果您需要制作Bag
类工具Iterable<T>
,那么您可以使用您为此目的实现的迭代机制removeMin
1}}方法。但即便如此,API也不适用于此目的。您仍然需要迭代集合两次。一旦找到最小的元素,第二次删除它。通过迭代器删除意味着迭代器需要实现可选的 Iterator.remove()
方法....这会让你回到正确的位置。
答案 1 :(得分:1)
这个可比较的东西是什么
简单来说,它指定了如何将项目相互比较。例如,在您的情况下,您的课程Bag
可能包含任何项目,因此您使用了通用类型T
,但您希望您的项目也可以相互比较,因此您使用了T extends Comparable<T>
Comparable 界面有一个方法compareTo
,用于比较项目。您可以在JLS中阅读更多相关信息。
现在您可能想知道为什么我需要比较项目?
想象一下,如果你无法比较,那么你怎么能说5
比1
更大的数字或A
在B
之前出现在字母表中的数字。他们这样做是因为我们对它们有一些订单并且基于它们我们可以比较它们。同样地,您可能希望包中的物品具有可比性。
如何从此Comparable数组中删除项目
要迭代您似乎已使用iterator
Iterator<T> iterator=iterator();
T min = iterator.next();
如果项目符合您的条件,您可以使用相同的迭代器来删除该项目。所以你的代码应该是iterator.remove()
。但是你还应该确保在所有相关地点进行空检查和存在检查
答案 2 :(得分:1)
这是java.lang.Comparable
界面。 <T extends Comparable<T>>
是泛型类型,在编译时Java将要求实例提供int compareTo(T o)
的实现(来自Javadoc)返回一个负整数,零或正整数,因为这object小于,等于或大于指定的对象。此外,您可以使用Bag
(而不是数组)备份Collection
,例如
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()
表示(部分)如果在迭代进行过程中以除调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。
答案 3 :(得分:1)
实现了类似的界面,以便为您的自定义类型定义比较机制。 数组通常是大小固定的,因此您不能只删除项目而不将其余项目复制到新数组。我建议将您的数组更改为动态列表:
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;
}
}