我正在构建数据结构以了解有关java的更多信息。我理解这个程序可能没用。
这就是我想要的。我想创建一个存储最小3个值的数据结构。如果值很高,则忽略它。存储值时,我也希望将它们放在正确的位置,以便我以后不必对它们进行排序。我可以通过调用add方法输入值。
所以,让我们说要加20,10,40,30,结果将是[10,20,30]。请注意,我只能保存3个最小值,并在放置它们时存储它们。
我也明白,有很多更好的方法可以做到这一点,但这只是为了学习目的。
问题:我需要帮助创建添加方法。我写了一些代码,但我遇到了添加方法。请帮忙。
我的想法:我们可能不得不在添加方法中使用Iterator?
public class MyJavaApp {
public static void main(String[] args){
MyClass<Integer> m = new MyClass<Integer>(3);
m.add(10);
m.add(20);
m.add(30);
m.add(40);
}
}
public class MyClass<V extends Comparable<V>> {
private V v[];
public MyClass(int s){
this.v = (V[])new Object[s];
}
public void add(V a){
}
}
答案 0 :(得分:1)
以下是您必须实施的添加方法的草图。
在比较元素时,您必须使用compareTo
方法的适当实现。
public void add(V a){
V temp = null;
if(a.compareTo( v[0]) == -1 ){
/*
keeping the v[0] in a temp variable since, v[0] could be the second
smallest value or the third smallest value.
Therefore call add method again to assign it to the correct
position.
*/
temp = v[0];
v[0] = a;
add(temp);
}else if(a.compareTo(v[0]) == 1 && a.compareTo(v[1]) == -1){
temp = v[1];
v[1] = a;
add(temp);
}else if(a.compareTo(v[1]) == 1 && a.compareTo(v[2]) == -1){
temp = v[2];
v[2] = a;
add(temp);
}
}
因此v
数组将包含最低元素。
希望这有帮助。
答案 1 :(得分:0)
一种天真,低效的方法(按照你的建议)迭代值并根据你发现的内容添加/删除:
Integer
注意:这是为V
编写的,而不是通用类型for number in range(1, 100):
。你需要概括一下。它也不会对列表进行排序 - 这是您的另一个要求。
答案 2 :(得分:0)
这是该算法的一种实现方式。它包括寻找合适的插入位置。然后它可以根据您的要求进行优化:
这是代码。为方便起见,我添加了toString()
方法。只有add()
方法很有趣。此实现也更灵活,因为它尊重您为构造函数提供的大小,并且不会假设3
。
我使用的是List
而不是数组,因为它使得处理泛型更加容易。您会发现使用泛型数组会使您的类更难看(即您必须通过提供Class<V>
来处理类型擦除)。
import java.util.*;
public class MyClass<V extends Comparable<V>> {
private int s;
private List<V> v;
public MyClass(int s) {
this.s = s;
this.v = new ArrayList<V>(s);
}
public void add(V a) {
int i=0;
int l = v.size();
// Find the right index
while(i<l && v.get(i).compareTo(a) < 0) i++;
if(i<s) {
v.add(i, a);
// Truncate the list to make sure we don't store more values than needed
if(v.size() > s) v.remove(v.size()-1);
}
}
public String toString() {
StringBuilder result = new StringBuilder();
for(V item : v) {
result.append(item).append(',');
}
return result.toString();
}
}