簡體   English   中英

Java和數據結構(Map,Hashmap,List,Arraylist等)

[英]Java and data structures (Map, Hashmap, List, Arraylist, …)

我是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以便我可以從上述結構讀取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>>>>();

但也許更簡單的方法可以勝任?

最好將對象結構的每個級別包裝在代表它的類中。 例如:

  • Data類包含一個Result類的數組(或arraylist)。
  • Result包含ValueCollection的數組(或arraylist),其中包含值。

這只是一個原始的建議。 面對這種情況時,請始終嘗試定義代表全局各個級別的類,這些類從主容器開始,再到可以用集合或字段表示的微小數據位。

自己想一想(如果您不能直接在代碼上提出建議,我總是建議使用筆和紙)並嘗試一下。 這是最好的學習方式。

您可能應該創建一些類來表示您要顯示的內容,而不是對所有內容進行參數化。

例如

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

然后,您必須編寫一種從數據結構中獲取數據的方法。 但是,您應該始終嘗試編寫盡可能簡單的代碼並組織所有內容,以便於理解。

您有一些選擇:

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

要么

List<List<String[]> result;

要么

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

甚至

String[][][] result;

...取決於您的使用情況和您的喜好。

我解決了我的問題

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.get(i) (其中0 <= i < n_results )為我提供了索引,我仍然得到上面r (在MAIN中)的大小為1。邊界異常。 這是為什么?

好吧,我想我不應該把aresultaddResult如果是""null或一些有趣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM