从可比数组中删除项目
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 中阅读更多相关信息。
现在您可能想知道为什么我需要比较项目?
想象一下,如果您无法比较,那么您怎么能说 5
比 1
大,或者为什么 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>
。该方法的实现应该将 this
与 other
实例
进行比较
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
问题有两部分:
- 在
data
中找到最小元素的索引
- 删除该索引处的元素
提示:第一部分要求您查看每个元素...并且必须完成在 你做删除之前。这应该反映在您的代码中。
1 - 如果您使用的是 ArrayList<T>
或类似的,那么使用 data.iterator()
将是一个合理的选择。问题是数组不直接支持 Iterable
API.
现在,如果您需要制作 Bag
class 工具 Iterable<T>
,那么您 可以 使用您为此目的在 removeMin
方法中实现的迭代机制。但即使在那里,API 也不是理想的用途。您仍然需要迭代集合两次。一次找到最小的元素,第二次将其删除。通过迭代器删除意味着迭代器需要实现 optional Iterator.remove()
方法....这会让你回到原点。
我是 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 中阅读更多相关信息。
现在您可能想知道为什么我需要比较项目?
想象一下,如果您无法比较,那么您怎么能说 5
比 1
大,或者为什么 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>
。该方法的实现应该将 this
与 other
实例
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>
.
My second question is how to remove an item from this Comparable array.
根据您对数组工作原理的了解,您可以自己弄清楚。您必须处理的最大限制是数组的大小无法更改,因此没有神奇的操作可以简单地从数组中间删除一些内容。
有两种方法:
创建一个仅包含您不想删除的元素的新数组。 (提示:复制它们)
在概念上删除元素时,将现有数组中的元素移动到 "fill the hole" 左侧。 (提示:注意
size
字段。它有什么用?)
假设您是从头开始编写 removeMin
方法,我认为您尝试在那里使用迭代器已经走入了死胡同1。尝试对其进行编码以直接在 data
数组上进行操作。
removeMin
问题有两部分:
- 在
data
中找到最小元素的索引 - 删除该索引处的元素
提示:第一部分要求您查看每个元素...并且必须完成在 你做删除之前。这应该反映在您的代码中。
1 - 如果您使用的是 ArrayList<T>
或类似的,那么使用 data.iterator()
将是一个合理的选择。问题是数组不直接支持 Iterable
API.
现在,如果您需要制作 Bag
class 工具 Iterable<T>
,那么您 可以 使用您为此目的在 removeMin
方法中实现的迭代机制。但即使在那里,API 也不是理想的用途。您仍然需要迭代集合两次。一次找到最小的元素,第二次将其删除。通过迭代器删除意味着迭代器需要实现 optional Iterator.remove()
方法....这会让你回到原点。