繁体   English   中英

如何对ArrayList进行排序 <String> 包含ArrayList的元素 <HashMap<String, String> &gt;已由比较器排序?

[英]How to sort ArrayList<String> containing elements of ArrayList<HashMap<String, String>> that has been sorted by a comparator?

我通过JSON获取一些数据,这些数据存储在Hashmap映射中,例如map.put(KEY_TITLE,parser.getString(“ title”)) ,然后将该映射添加到ArrayList> bookList 这在以bookList作为适配器源的列表视图中显示。 另外,我还将地图的所有书籍信息(书名,作者,出版日期)存储在Arraylist arrTitles,arrAuthors,arrDates中,因为我需要将这些值传递给下一个活动。 我的问题是,当我使用比较器根据书名对bookList进行排序时,bookList得到很好的排序。 但是,我想按照bookList的新排序对arrTitles,arrAuthors和arrDates进行排序,以便我的arrTitles.getItem(position)将正确的值发送到下一个活动。 知道我该怎么做吗? 以下是哈希图,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));
    }
};

没错,使用新代码似乎相当简单:对地图列表进行排序后,只需创建单个列表即可:

// 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> 我怀疑,在代码的其他地方使用它会容易得多。

您的代码仅是正确的。 您必须按照要求进行格式化。 您会从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);


            }
        });

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM