【问题标题】:Java and data structures (Map, Hashmap, List, Arraylist, ...)Java 和数据结构(Map、Hashmap、List、Arraylist,...)
【发布时间】:2012-11-30 12:09:51
【问题描述】:

我是 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, ..., Z 可以在每个RESULT 中的每个ARRAY 中不同,但N 对于所有RESULT 始终相同。我想访问DATA,以便我可以从上面的结构中读取ARRAYs

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

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

【问题讨论】:

  • 看起来像List&lt;List&lt;List&lt;String&gt;&gt;&gt;

标签: java list map arraylist hashmap


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    例如

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

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

    【讨论】:

      【解决方案3】:

      你有一些选择:

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

      List<List<String[]> result;
      

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

      甚至

      String[][][] result;
      

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

      【讨论】:

        【解决方案4】:

        我的问题解决了

        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 异常。这是为什么呢?

        好吧,如果是addResult,我想我不应该将a 放入result 中,如果它是""null 或其他有趣的东西。

        【讨论】:

          猜你喜欢
          • 2011-08-18
          • 2011-02-13
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多