创建java通用数据结构

时间:2015-11-13 03:55:48

标签: java generics

我正在构建数据结构以了解有关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){

    }
}

3 个答案:

答案 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();
    }
}