如何对包含ArrayList元素的ArrayList <string>进行排序<hashmap <string,string =“”>&gt;已经用比较器排序?</hashmap <string,> </string>

时间:2014-02-05 06:54:58

标签: java android sorting arraylist hashmap

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

 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));
    }
};

4 个答案:

答案 0 :(得分:2)

是的,使用新代码看起来相当简单:只需在之后创建单个列表,您就已经对地图列表进行了排序:

// 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<String, String>。我怀疑,在代码中的其他地方工作会更简单。

答案 1 :(得分: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);


            }
        });

答案 2 :(得分:1)

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

答案 3 :(得分:0)

@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);