Java和数据结构(Map,Hashmap,List,Arraylist,...)

时间:2012-12-12 17:51:34

标签: java list map arraylist hashmap

我是Java和Android开发的新手,我一直坚持跟随问题。我的应用程序从数据库中获取一些数据,我希望以下列方式构建数据:

DATA = 
{ 
  RESULT[0] = 
  {
    ARRAY[0]=
    {
      VALUE[0], ..., VALUE[X]
    },
    ARRAY[1] = 
    {
      VALUE[0], ..., VALUE[Y]
    },
    ...,
    ARRAY[N] = 
    {
      VALUE[0], ..., VALUE[Z]
    }
  },
  RESULT[1] =
  {
    /* Same as above */
  },
  ...,
  RESULT[M] =
  {
    /* Same as above */
  }
}

其中X, Y, ..., ZARRAY的每个RESULT中可能不同,但N对于所有RESULT始终相同。我想访问DATA,以便我可以从上面的结构中读取ARRAY

ListArray<String> array = readData(indexOfResult,indexOfArray);

其中indexOfResult为0 ... M且indexOfArray为0 ... N。

我试过这个

Map<Integer,List<Map<Integer,ArrayList<String>>>> data
 = new HashMap<Integer,List<Map<Integer,ArrayList<String>>>>();

但也许更简单的事情可以完成这项工作?

4 个答案:

答案 0 :(得分:1)

最好在表示它的类中包装对象结构的每个级别。例如:

  • Data包含Result的数组(或arraylist) 类。
  • Result包含ValueCollection的数组(或arraylist) 包含值。

这只是一个原始的建议。面对这种情况时,总是尝试定义代表大图的不同级别的类,从主容器开始,再进一步到可以用集合或字段表示的微小数据。

自己想想一个设计(我总是推荐使用笔和纸,如果你不能直接在代码上提出一个)并试一试。这是最好的学习方式。

答案 1 :(得分:0)

你应该创建一些代表你试图展示的东西的类,而不是参数化。

e.g。

class Example implements Map<Integer, List<String>> {
...
}

或者如果你想按自己的方式去做:

Map<Integer,List<Map<Integer,ArrayList<String>>>> data = new HashMap<Integer,List<Map<Integer,ArrayList<String>>>>();

List<Map<Integer,ArrayList<String>>> list1 = new Arraylist<Map<Integer,ArrayList<String>>>();
Map<Integer,ArrayList<String>> map1 = new HashMap<Integer,ArrayList<String>>();
ArrayList<String>> list2 = new ArrayList<String>>();

list2.add("test");
map1.add(1, list2);
list1.add(map1);

data.put(1, list1);

然后你必须编写一个方法,从数据结构中获取这些数据。但是你应该总是尝试编写尽可能简单的代码并构造所有内容以便于理解。

答案 2 :(得分:0)

你有一些选择:

Map<Integer,List<String[]> result;

List<List<String[]> result;

List<List<List<String>>> result;

甚至

String[][][] result;

...取决于您的使用情况和您喜欢的内容。

答案 3 :(得分:0)

我用

解决了我的问题
SparseArray<SparseArray<ArrayList<String>>>

然而,我遇到了另一个我无法理解的问题。我跟着

/* MAIN */

Data data;

String s = "";
ArrayList<String> arr_N = new ArrayList<String>();
arr_N.add(s);
data.addResult(arr_N);

并且在课程数据中我有

/* CLASS DEFINITION */

class Data {

  private final static int N_A = 0;
  private SparseArray<SparseArray<ArrayList<String>>> results;
  private int n_results;

  public Data() {
    this.results = new SparseArray<SparseArray<ArrayList<String>>>();
    this.n_results = 0;
  }

  public void addResult(ArrayList<String> a) {
    SparseArray<ArrayList<String>> result = new SparseArray<ArrayList<String>>(1);
    result.put(N_A,a);
    this.results.put(this.n_results,result);
    this.n_results++;
  }

  public ArrayList<String> getA_N(int i) {
    return( this.get_value(i,N_A) );
  }

  private ArrayList<String> get_value(int i, int j) {
    SparseArray<ArrayList<String>> result = this.results.valueAt(results.keyAt(i));
    ArrayList<String> list = result.valueAt(result.keyAt(j));
    return( list );
  }
}

现在,如果我这样做

/* MAIN */

int i = 0; /* Something that is < n_results in class Data */
ArrayList<String> r = data.getA_N(i);
int n_r = r.size();
System.out.println("Size of a_n is " + r.size() );

我得到“a_n的大小是1”。

Q1:在开始时我设置了s = "";,但这是不是将它视为空字符串?

Q2:如果我r.isEmpty()我知道r不是空字符串(尽管我设置了s = "";)。这是为什么?

问题3:如果我在开头设置了s = null,我仍然认为r以上(MAIN)的大小为1,即使r.get(i)(其中0 <= i&lt; n_results)给出了Index out of bounds exception。那是为什么?

好的,我认为如果aresult或其他有趣的话,我不应该将addResult放入""中的null