1

我是 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 */
  }
}

whereX, Y, ..., Z可以在每个ARRAY中有所不同,RESULTN对所有始终相同RESULT。我想访问DATA以便我可以ARRAY从上面的结构中读取 s

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

其中indexOfResult0...M 和indexOfArray0...N。

我试过这个

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

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

4

4 回答 4

1

您最好将对象结构的每一级包装在一个代表它的类中。例如:

  • 该类Data包含一个类数组(或数组列表)Result
  • Result包含 的数组(或数组列表)ValueCollection,其中包含值。

这只是一个粗略的建议。面对这种情况时,总是尝试定义代表全局不同层次的类,从主容器开始,再到可以用集合或字段表示的微小数据。

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

于 2012-12-12T17:57:53.357 回答
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 = "";)。这是为什么?

Q3:如果我s = null在开始时设置,我仍然得到r上面(在 MAIN 中)的大小为 1,即使r.get(i)(其中 0 <= i< n_results)给了我 Index out of bounds 异常。这是为什么?

好吧,我想我不应该把它a放进去result,或者有趣的东西。addResult""null

于 2012-12-22T21:02:59.887 回答
0

您可能应该创建一些代表您要显示的内容的类,而不是对所有内容进行参数化。

例如

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

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

于 2012-12-12T18:00:34.070 回答
0

你有一些选择:

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

或者

List<List<String[]> result;

或者

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

甚至

String[][][] result;

...取决于您的使用情况和您的喜好。

于 2012-12-12T18:02:36.560 回答