【问题标题】:How to sort ArrayList<String> containing elements of ArrayList<HashMap<String, String>> that has been sorted by a comparator?如何对包含已由比较器排序的 ArrayList<HashMap<String, String>> 元素的 ArrayList<String> 进行排序?
【发布时间】:2014-03-01 11:40:45
【问题描述】:

我通过 JSON 获取一些数据,这些数据存储在 Hashmap 地图 中,例如ma​​p.put(KEY_TITLE, parser.getString("title")) 然后将地图添加到 ArrayList> bookList。这显示在一个列表视图中,其中 bookList 作为适配器的源。此外,我还将地图的所有书籍信息(标题、作者、出版日期)存储在 Arraylist arrTitles、arrAuthors、arrDates 中,因为我需要将这些值传递给我的下一个活动。我的问题是,当我使用比较器根据标题对 bookList 进行排序时,bookList 的排序就很好了。但是,我想根据 bookList 的新排序对我的 arrTitles、arrAuthors 和 arrDates 进行排序,以便我的 arrTitles.getItem(position) 将正确的值发送到下一个活动。知道我该怎么做吗?下面是 hashmap、arraylist、onItemClick 和比较器代码:

 for (int i = 0; i < json.Length(); i++) {
        HashMap<String, String> map = new HashMap<String, String>();
        // adding each child node to HashMap key => value
        map.put(KEY_ID, json.getString("id"));
        map.put(KEY_TITLE, json.getString("title"));
        map.put(KEY_AUTHOR, json.getString("author"));
        map.put(KEY_DATE, json.getString("date"));
        arrTitles.add(json.getString("title");
        arrAuthors.add(json.getString("author");
        arrDates.add(json.getString("date");
        //add map to ArrayList
        booksList.add(map);
}

        list=(ListView)findViewById(R.id.list);
        Collections.sort(booksList, mapComparator);
        adapter=new LazyAdapter(this, booksList);        
        list.setAdapter(adapter);

        // Click event for single list row
        list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
        Intent intent = new Intent(this, editList.class);
        intent.putExtra("title", arrTitles.getItem(position));
        intent.putExtra("date", arrDates.getItem(position));
        startActivity(intent);


        }
    }); 
 } 

       public Comparator<Map<String, String>> mapComparator = new Comparator<Map<String, String>>() {
       public int compare(Map<String, String> m1, Map<String, String> m2) {
       return m1.get(KEY_TITLE).compareTo(m2.get(KEY_TITLE));
    }
};

【问题讨论】:

  • 很难分辨上下文,因为您在方法的中途发布了代码。这段代码是循环的吗?目前尚不清楚我们将如何最终获得多个项目,尤其是当您在添加到列表后立即开始一项新活动时。此外,使用地图而不是创建具有title 属性等的Book 类有什么好的理由吗?后者通常会更干净,IMO。
  • 很抱歉。是的,booksList 会循环更新。已更新我的代码以反映相同的情况。
  • 循环前集合是空的吗?
  • 是的,在循环之前集合是空的。

标签: java android sorting arraylist hashmap


【解决方案1】:

没错,新代码看起来相当简单:只需在您对地图列表进行排序后创建单独的列表:

// This loop looks wrong at the moment - you're not using i
for (int i = 0; i < json.Length(); i++) {
     HashMap<String, String> map = new HashMap<String, String>();
     // adding each child node to HashMap key => value
     map.put(KEY_ID, json.getString("id"));
     map.put(KEY_TITLE, json.getString("title"));
     map.put(KEY_AUTHOR, json.getString("author"));
     map.put(KEY_DATE, json.getString("date"));
     booksList.add(map);
}

for (Map<String, String> map : booksList) {
     arrTitles.add(map.get(KEY_TITLE));
     arrAuthors.add(map.get(KEY_AUTHOR));
     arrDates.add(map.get(KEY_DATE));
}

请注意,我仍然强烈建议创建一个Book 类来存储数据,而不是使用带有固定键的Map&lt;String, String&gt;。我怀疑在代码的其他地方使用它会简单得多。

【讨论】:

  • 谢谢,让我尝试创建 Book 类。
【解决方案2】:

您的代码是正确的。您必须根据要求进行格式化。您从 json 对象中获取 arrTitles、arrAuthors 和 arrDates。据我了解,您必须在拍摄地图后获取数据。 下面是一些修改代码。看看这个

for (int i = 0; i < json.Length(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            // adding each child node to HashMap key => value
            map.put(KEY_ID, json.getString("id"));
            map.put(KEY_TITLE, json.getString("title"));
            map.put(KEY_AUTHOR, json.getString("author"));
            map.put(KEY_DATE, json.getString("date"));

            //add map to ArrayList
            booksList.add(map);
    }





            list=(ListView)findViewById(R.id.list);
            Collections.sort(booksList, mapComparator);
            adapter=new LazyAdapter(this, booksList);        
            list.setAdapter(adapter);

        for (Map<String, String> map : booksList) {
                arrTitles.add(json.getString("title");
                arrAuthors.add(json.getString("author");
                arrDates.add(json.getString("date");
        }

            // Click event for single list row
            list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
            Intent intent = new Intent(this, editList.class);
            intent.putExtra("title", arrTitles.getItem(position));
            intent.putExtra("date", arrDates.getItem(position));
            startActivity(intent);


            }
        });

【讨论】:

    【解决方案3】:

    书单中的地图包含所有必需的详细信息,那么为什么不从适配器获取该特定列表项的地图对象并从地图中获取详细信息。

    【讨论】:

      【解决方案4】:

      @gvmani:我认为您指的是类似于我在下面所做的实现:-

                  HashMap <String,String> mapBook = booksList.get(position);
                  String strTitle = mapBook.get(KEY_TITLE);
                  String strAuthor = mapBook.get(KEY_AUTHOR);
      
                  Intent intent = new Intent(ListView.this,editList.class);
                  intent.putExtra("title", strTitle);
                  intent.putExtra("author", strAuthor);
                  startActivity(intent);
      

      【讨论】:

      • 类似的东西。我想最好使用您的适配器返回特定位置的地图。
      猜你喜欢
      • 1970-01-01
      • 2017-06-01
      • 2013-09-09
      • 1970-01-01
      • 2012-03-24
      • 2017-02-24
      • 2018-11-25
      • 2016-08-28
      • 2017-08-30
      相关资源
      最近更新 更多