android - 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;
}
}
有什么建议么??
解决方案
简单来说:
如果您的键是 int 或 long,您应该使用 SparseArray、SparseLongArray,因为它不会在操作时对键值进行装箱/取消装箱。此外,只要键是 int/long,它就为 int/long 值提供类似的类。
如果你的 key 既不是 int 也不是 long,比如一个 object 或 String,你应该使用 ArrayMap 来代替,因为它会处理 key hash 的冲突。
这两个类之间没有太大的性能和内存使用差异,因为它们都需要 O(log n) 来搜索和 O(n) 来插入/删除(在大多数情况下)。
推荐阅读
- bash - 使用 awk/sed 将列值替换为多个文件的某些行值
- java - ShareCompat.IntentBuilder - 如何删除自己的应用程序
- flask - 烧瓶登录:current_user 返回无
- html - 可访问性:YouTube 嵌入代码应具有标题属性
- namespaces - 如何在 Elixir Phoenix iex 控制台中停止强制模块命名空间?
- mysql - 在 SQL 中从多行创建一行
- python - 面板数据组的迭代和差异
- php - 需要在 laravel 中使用 DB::commit 两次以使事务正常工作
- symfony - Symfony 4 - GET / hi 未找到
- c++ - C++ - 使指向对象成为对象常量的一部分