user1924249
user1924249

Reputation: 566

creating java generic data structure

I am building a data structure to learn more about java. I understand this program might be useless.

Here's what I want. I want to create a data structure that store smallest 3 values. if value is high, then ignore it. When storing values than I also want to put them in correct place so I don't have to sort them later. I can enter values by calling the add method.

so let's say I want to add 20, 10, 40, 30 than the result will be [10,20,30]. note I can only hold 3 smallest values and it store them as I place them.

I also understand that there are a lot of better ways for doing this but again this is just for learning purposes.

Question: I need help creating add method. I wrote some code but I am getting stuck with add method. Please help.

My Thinking: we might have to use a Iterator in add method?

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){

    }
}

Upvotes: 0

Views: 1066

Answers (3)

mprivat
mprivat

Reputation: 21902

Here's an implementation of that algorithm. It consists of looking for the right place to insert. Then it can be optimized for your requirements:

  • Don't bother looking past the size you want
  • Don't add more items than necessary

Here's the code. I added the toString() method for convenience. Only the add() method is interesting. Also this implementation is a bit more flexible as it respects the size you give to the constructor and doesn't assume 3.

I used a List rather than an array because it makes dealing with generics a lot easier. You'll find that using an array of generics makes using your class a bit more ugly (i.e. you have to deal with type erasure by providing a 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();
    }
}

Upvotes: 0

tharindu_DG
tharindu_DG

Reputation: 9261

Here is a rough sketch of the add method you have to implement. You have to use the appropriate implementation of the compareTo method when comparing elements.

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);
    }
}

Therefore the v array will contain the lowerest elements.

Hope this helps.

Upvotes: 1

dave
dave

Reputation: 11975

A naive, inefficient approach would be (as you suggest) to iterate through the values and add / remove based on what you find:

public void add(Integer a)
{
    // If fewer than 3 elements in the list, add and we're done.
    if (m.size() < 3)
    {
        m.add(a);
        return;
    }
    // If there's 3 elements, find the maximum.
    int max = Integer.MIN_VALUE;
    int index = -1;
    for (int i=0; i<3; i++) {
        int v = m.get(i);
        if (v > max) {
            max = v;
            index = i;
        }
    }
    // If a is less than the max, we need to add it and remove the existing max.
    if (a < max) {
        m.remove(index);
        m.add(a);
    }
}

Note: this has been written for Integer, not a generic type V. You'll need to generalise. It also doesn't keep the list sorted - another of your requirements.

Upvotes: 0

Related Questions