【问题标题】:How do I remove two same elements from a JSONArray?如何从 JSONArray 中删除两个相同的元素?
【发布时间】:2018-03-23 16:55:50
【问题描述】:

我可以解析json并用listview列出来。

我想从 json 中删除两个相同的元素,我只想列出一个。

代码:

public class MainActivity extends AppCompatActivity {

    ArrayList<Product> arrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        arrayList = new ArrayList<>();

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                new ReadJSON().execute(url);
            }
        });
    }

    class ReadJSON extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... params) {
            return readURL(params[0]);
        }

        @Override
        protected void onPostExecute(String content) {
            try {

                JSONObject jsonObject = new JSONObject(content);
                JSONArray jsonArray =  jsonObject.getJSONArray("School");
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject c = jsonArray.getJSONObject(i);
                    JSONArray server = c.getJSONArray("Names");
                    for(int j=0; j<server.length(); j++){
                        JSONObject serverObject = server.getJSONObject(j);

                        arrayList.add(new Product(
                                serverObject.getString("id"),
                                serverObject.getString("name")
                        ));
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            NewtAdapter adapter = new NewtAdapter(
                    getApplicationContext(), R.layout.list, arrayList
            );
            ListView listview = (ListView) findViewById(R.id.listView);
            listview.setAdapter(adapter);
        }
    }
}

json 文件:

{
    "School":[
        {
            "Names":[
                    {"id":"1", "name":"John"},
                    {"id":"2", "name":"Amanda"},
                    {"id":"3", "name":"Robert"},
                    {"id":"4", "name":"Jackie"},
                    {"id":"5", "name":"Palma"},
                    {"id":"1", "name":"Walcott"}
                ]
        }
    ]
}

输出:

1 - 约翰


2 - 阿曼达


3 - 罗伯特


4 - 杰基


5 - 帕尔马


1 - 沃尔科特

我想删除相同的 ID,只想列出一个。

输出应该是这样的:

1 - 约翰


2 - 阿曼达


3 - 罗伯特


4 - 杰基


5 - 帕尔马

我该怎么做?

谢谢。

【问题讨论】:

  • 使用SetObject。或者使用ArrayList,您可以在添加新项目之前检查重复项目。

标签: android json listview


【解决方案1】:

假设你的 Product 类有一个 getId() 方法,修改你的代码,如下:

for(int j=0; j<server.length(); j++){
    JSONObject serverObject = server.getJSONObject(j);

    arrayList.add(new Product(
        serverObject.getString("id"),
        serverObject.getString("name")
    ));
}

到这里:

for(int j=0; j<server.length(); j++){
    JSONObject serverObject = server.getJSONObject(j);

    boolean alreadyInList = false;
    for (Product p : arrayList) {
        if (p.getId().equals(serverObject.getString("id")))
            alreadyInList = true;
    }

    if (!alreadyInList)
        arrayList.add(new Product(
            serverObject.getString("id"),
            serverObject.getString("name")
        ));
}

基本上,在您将新项目添加到列表中之前,您会检查是否已经存在具有相同 ID 的内容。

【讨论】:

  • 很好 - 如果可以做一个额外的假设,即 Product 类使用其“id”实现“equals”以便“alreadyInList”逻辑可以替换为 arrayList.contains( )。
【解决方案2】:

试试

outer:
for(int j=0; j<server.length(); j++)  {         
   JSONObject serverObject = server.getJSONObject(j);
   for(Product product : arrayList) {
         if(product.getId().equals(serverObject.getString("id")))
                 continue outer;
   }

  arrayList.add(new Product(serverObject.getString("id"), serverObject.getString("name") ));
}

【讨论】:

  • 有什么问题?? @JackNc
  • 这里的continue是和内层foreach循环相关的,所以不会中断外层循环的执行
猜你喜欢
  • 2012-02-07
  • 2023-03-17
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
相关资源
最近更新 更多