3

について初めて学び始めたときHashMap、私は自分の会社の社内向け Android アプリを作成し、各項目のプロパティの個別のマップを作成しました。ラインアイテムは動的で、対応する値を持ついくつかのプロパティがあります。

例 (すべてのマップが含まれているわけではありません):

// Preceding onCreate()
HashMap<Integer, Double> latMap;
HashMap<Integer, Double> lngMap;
HashMap<Integer, String> descMap;
// In onCreate()
latMap = new HashMap<Integer, Double>();
lngMap = new HashMap<Integer, Double>();
descMap = new HashMap<Integer, String>();

LogCat (構造: {ItemNumber=Value, ItemNumber=Value}):

-- latMap output --
{1=0.0, 2=0.0}
-- lngMap output --
{1=0.0, 2=0.0}
-- descMap output --
{1=NULL, 2=NULL}

現在、2 つのマップのみをテストしています。メインHashMapにはアイテム番号が含まれており、個々のプロパティと値を保持するマップが含まれています。

例:

// Preceding onCreate()
HashMap<Integer, HashMap<String, String>> testMapFull;
HashMap<String, String> testMapContent;
// In onCreate()
testMapFull = new HashMap<Integer, HashMap<String, String>>();
testMapContent = new HashMap<String, String>();

LogCat (構造: {ItemNumber{Property=Value, Property=Value}}):

{
    1={
        object_lat=0.0,
        object_lng=0.0,
        desc=NULL,
    },
    2={
        object_lat=0.0,
        object_lng=0.0,
        desc=NULL,
    }
}

私の質問: メモリ効率などに大きな違いはありますか? 現在、すべてがそのまま機能しています。はい、2 つのマップは複数のマップよりも優れている必要があることはわかっていますが、それらには同じ量の情報が含まれており、インスタンス化する必要はありません。

4

2 に答える 2

2

特定のアイテムに関するすべての情報を保持するカスタム クラスを宣言できないのはなぜですか? HashMapの数を 1に減らすことができます。

public class Item {
    public double lat;
    public double lng;

    public String desc;
}

HashMap<Integer, Item> itemMap;

メモリを 1 つしか使用せず、不要な一時オブジェクトを作成する操作HashMapを回避できるため、必要なメモリが大幅に少なくて済みます。Boxing/Unboxing

また、代わりにBoxing/Unboxing使用することで、操作の数をさらに減らすことができますSparseArrayHashMap<Integer, ?>

于 2013-03-06T17:25:17.797 に答える
1

@vmironovによって提供された回答に基づいて可能な解決策は、すべての変数を保持するクラスを使用してからHashMapに切り替えるようです。SparseArrayItem

これは、将来の訪問者のために、これをどのように設定するかの簡単な例です。

SparseArray<Item> sparseTest;

// Create an instance of this class for each item
public class Item {
    public String desc;
}
int itemNumber = 1;

// Set item variables
Item item = new Item();
item.desc = "Test Description";

// Once all variables are set, put into SparseArray
sparseTest = new SparseArray<Item>();
sparseTest.put(itemNumber, item);

// My application requires this data to be stored in a JSONArray
JSONArray ja = new JSONArray();
JSONObject innerJo = new JSONObject();
JSONObject wrapperJo = new JSONObject();
try {
    innerJo.put("desc", sparseTest.get(itemNumber).desc);
    wrapperJo.put("" + itemNumber, innerJo);
    ja.put(wrapperJo);
} catch (JSONException e1) {
    e1.printStackTrace();
}

そして最後に出力:

[{"1":{"desc":"Test Description"}}]

私の広告申込情報の値は変更または変更できるため、これは次の方法で簡単に実行できます。

sparseTest.get(itemNumber).desc = "Description Test";
于 2013-03-06T18:50:03.907 に答える