首页 > 解决方案 > arraymap 比稀疏数组更好地记住从 JSON 文件中捕获的一些数据?

问题描述

我编写了一个代码,它使用解析从 JSON 文件中捕获一些数据,但我不知道在稀疏数组或数组映射之间哪种结构更好来记忆这些数据?

我曾经使用过数组映射,但我不知道它是否太浪费在这么少的数据数据上。

public class MainActivity extends AppCompatActivity {

private ProgressDialog pd;
private String TAG = MainActivity.class.getSimpleName();
public ArrayMap<Integer, ValoriDiSueg> ArrayDati = new ArrayMap<>();



Button buttonProg;
TextView textViewProg;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buttonProg = (Button) findViewById(R.id.button);
    textViewProg = (TextView) findViewById(R.id.textView);

    buttonProg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new JsonCLASS().execute("https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22");
        }
    });

}

private class JsonCLASS extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();


        pd = new ProgressDialog(MainActivity.this);
        pd.setMessage("Please wait");
        pd.setCancelable(false);
        pd.show();
    }

    @Override
    protected String doInBackground(String... params) {


        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();


            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();
            String line = "";

            while ((line = reader.readLine()) != null) {
                buffer.append(line + "\n");
                Log.d("Response: ", "> " + line);   //here u ll get whole response...... :-)

            }

            return buffer.toString();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

这些数据的解析

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);


        try {
            JSONObject jsonObject = new JSONObject(result);
            JSONArray Arr = new JSONArray(jsonObject.getString("weather"));
            for (int i = 0; i < Arr.length(); i++){

                JSONObject jsonPart = Arr.getJSONObject(i);


                 ArrayDati.put(i,new ValoriDiSueg( jsonPart.getString("main"), jsonPart.getString("description")));
                //ArrayDati.put(i,new ValoriDiSueg("description : "+ jsonPart.getString("description")));
                textViewProg.setText(textViewProg.getText()+"main : "+ ArrayDati.get(i).Main +"\n"+textViewProg.getText()+"description : "+ ArrayDati.get(i).Description );

            }

        } catch (Exception e ){
            e.printStackTrace();
        }


        if (pd.isShowing()) {
            pd.dismiss();
        }


    }


}
}

我创建了一个类:

public class ValoriDiSueg {

 String Main;
 String Description;


 public ValoriDiSueg(String main, String description) {
     this.Main  = main;
     this.Description = description;
 }

 }

有什么建议么??

标签: androidarrays

解决方案


简单来说:

  • 如果您的键是 int 或 long,您应该使用 SparseArray、SparseLongArray,因为它不会在操作时对键值进行装箱/取消装箱。此外,只要键是 int/long,它就为 int/long 值提供类似的类。

  • 如果你的 key 既不是 int 也不是 long,比如一个 object 或 String,你应该使用 ArrayMap 来代替,因为它会处理 key hash 的冲突。

这两个类之间没有太大的性能和内存使用差异,因为它们都需要 O(log n) 来搜索和 O(n) 来插入/删除(在大多数情况下)。


推荐阅读