Md. Tahmid Mozaffar
Md. Tahmid Mozaffar

Reputation: 1005

Use custom class in HashMap in android

EDIT: I have posted it earlier for java. But it working in Java but not in android. So I am posting the android code now.

I am trying to use a custom class into a HashMap in my android application. But it is not giving my desired output. Please help.

I want to do something like this...

//Code for android application:

//Point class

class Point{
 private int x;
 private int y;

public Point(){

}
public Point(int _x, int _y){
  this.x = _x;
  this.y = _y;
}

}

DataManager.java

public class DataManager {

    private Vector<Integer> RSSI = null;
    private int numOfRSSI;

    private Map<Vector<Integer>, Point> SingleData = null;
    private Vector<Map<Vector<Integer>, Point>> Data = null;
    private Context context;

    public DataManager(Context _context) {
        this.context = _context;        
        Data = new Vector<Map<Vector<Integer>, Point>>();
    }

    public void loadData(String filename) {
        if (Data == null) {
            System.out.println("***ERROR: DataSet not initalized!!!\n");
        }
        readFile(filename);
    }

    public void printData(){        
        Vector<Integer> rssi = null;
        Map<Vector<Integer>, Point> single = null;
        Point point = null;

        for(int i=0;i<Data.size();i++){
        single = new HashMap<Vector<Integer>, Point>() ;
        single = Data.get(0);

        for (Map.Entry<Vector<Integer>, Point> entry :single.entrySet()) {

              rssi = new Vector<Integer>();           
              point = new Point();            
              rssi = entry.getKey();
              point = entry.getValue();           
              System.out.print("("+point.x+" "+point.y+") ");

              for(int j = 0;j<rssi.size(); j++){
                  System.out.print(rssi.get(j)+" ");
              }           
              System.out.println("");
        }       
        }       
    }

    private void readFile(String filename) {

        InputStream is = null;
        try {
            is = context.getResources().getAssets().open("datasets.txt");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("error file reading");
        }

        if (is != null) {

            StringBuilder text = new StringBuilder();
            int flag = 0;

            try {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is));

                String line;

                while ((line = br.readLine()) != null) {

                    if(flag==0){
                        flag=1;
                        this.numOfRSSI = Integer.parseInt(line);
                        System.out.println("number of RSSI: "+numOfRSSI);
                    }
                    else if(flag==1){
                        parseLine(line);
                    }

                }

            } catch (IOException e) {
                // Error reading file
            }

            finally {
                // myHelper.print(text.toString());

            }
        }

    }

    private void parseLine(String line) {

        RSSI = new Vector<Integer>();
        SingleData = new HashMap<Vector<Integer>, Point>();


        StringTokenizer st = new StringTokenizer(line, ",");
        int co = 0;
        int x=0,y=0;
        while (st.hasMoreTokens()) {

            if(co < this.numOfRSSI){
                RSSI.add(Integer.parseInt(st.nextToken()));
                co++;
            }
            else{
                x = Integer.parseInt(st.nextToken());
                y = Integer.parseInt(st.nextToken());
            }

        }

        Point point = new Point(x,y);

        SingleData.put(RSSI, point);

        Data.add(SingleData);
    }

}

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        DataManager dataManager = new DataManager(MainActivity.this);

        dataManager.loadData("datasets.txt");

        dataManager.printData();
    }

}

datasets.txt

5 -61,-51,-46,-41,-28,1,0

-60,-50,-51,-47,-34,2,0

-72,-52,-53,-55,-37,3,0

-60,-44,-58,-53,-40,3,1

-68,-55,-46,-47,-45,2,1

-66,-60,-48,-43,-37,1,1

-62,-57,-49,-45,-34,0,2

Output is showing.....

1 0 -61 -51 -46 -41-28

1 0 -60 -50 -51 -47 -34

1 0 -72 -52 -53 -55 -37

etc.....

But it should be...

1 0 -61 -51 -46 -41-28

2 0 -60 -50 -51 -47 -34

etc...

So this is my problem.

Upvotes: 3

Views: 1882

Answers (4)

Piyush
Piyush

Reputation: 18923

You should change this from

for(int i=0;i<Data.size();i++){
    single = new HashMap<Vector<Integer>, Point>() ;
    single = Data.get(0);

}

to

 for(int i=0;i<Data.size();i++){
    single = new HashMap<Vector<Integer>, Point>() ;
    single = Data.get(i);
 }

Upvotes: 1

vipul mittal
vipul mittal

Reputation: 17401

try changing:

single = Data.get(0);

to

single = Data.get(i);

Upvotes: 0

mogli
mogli

Reputation: 1609

Below is working fine on my machine :-

import java.util.Map;
import java.util.Vector;

public class Demo {

    public static void main(String[] args) {
        Map<Vector<Integer>, Point> vectorPointMap = new HashMap<Vector<Integer>, Point>();

        Vector<Integer> vector1 = new Vector<Integer>();
        vector1.add(1);
        vector1.add(2);
        vector1.add(3);

        vectorPointMap.put(vector1, new Point(10, 10));

        Vector<Integer> vector2 = new Vector<Integer>();
        vector2.add(4);
        vector2.add(5);
        vector2.add(6);

        vectorPointMap.put(vector2, new Point(20, 20));

        // Print data
        for (Map.Entry<Vector<Integer>, Point> entry : vectorPointMap.entrySet()) {


            Vector<Integer> keyVector = entry.getKey();
            Point valuePoint = entry.getValue();

            System.out.print("(" + valuePoint.x + " " + valuePoint.y + ") ");

            for (int j = 0; j < keyVector.size(); j++) {
                System.out.print(keyVector.get(j) + " ");
            }

            System.out.println("");
        }
    }
}

Upvotes: 1

nonahex
nonahex

Reputation: 677

What does it mean, "it does not give right"?

You can put your own classes to Map, there is no problem. But remember, when you put items to HashMap in some order, there is no guarantee, it will come out in the same order. If you need to have same order on output, as on input, instead HashMap use LinkedHashMap. You can use it in the same way as HashMap, but it preserves order of inserted items.

Upvotes: 0

Related Questions