我们如何在Android中对ArryMap进行排序

时间:2017-04-04 11:22:11

标签: java android

我在我的Activity中使用ArrayMap来存储我的响应。 ArrayMap<String, PublicSpotData> publicSpotData ArrayMap将存储索引和键值对。现在我在排序ArrayMap时遇到了问题。我想根据publicSpotData.getAt() (int)对ArrayMap进行排序。 我已经做到了。

List<Map.Entry<String, PublicSpotData>> entries = new ArrayList<>(); for (Map.Entry<String, PublicSpotData> entry : publicSpotData.entrySet()) { entries.add(entry); }

 Collections.sort(entries, new Comparator<Map.Entry<String, PublicSpotData>>() {
                @Override
                public int compare(Map.Entry<String, PublicSpotData> o1, Map.Entry<String, PublicSpotData> o2) {
                    return o2.getValue().getAt().compareTo(o1.getValue().getAt());
                }
            });

            for (Map.Entry<String, PublicSpotData> entry : entries)
                publicSpotData.put(entry.getKey(), entry.getValue());`

但这并没有解决我的问题。 任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用收藏品#sort种种 method

Collections.sort(new ArrayList<>(c), aComparator);

c只是ArrayMap中的key set 和aComparator是比较器的自定义实现,用于对地图中的元素进行排序

答案 1 :(得分:1)

您可以通过提供 Comparator 任何 Java集合进行排序。

换句话说:你必须创建一个知道如何比较两个 PublicSpotData 对象的类;然后将其与Collections.sort()一起使用。

含义:只要你的“传入”对象实现了一个Java集合接口(并且Android ArrayMap是一个Map,它是一个集合);您可以使用java库的默认方式对其进行排序。

但是,问题更复杂:您只能排序列表。您的输入数据......表示为Map。所以,让我们一步一步走:

List<PublicSpotData> dataObjects = ... coming from somewhere
Collections.sort(dataObjects, new Comparator<PublicSpotData>() { ...
  here you put the comparator for that thing);

现在您有一个按该条件排序的列表。

从这个意义上说:真正的问题是您的模型不支持您的需求。 Map的本质是提供映射功能。 你需要:

  • 提取数据对象列表
  • 排序
  • 迭代排序列表;并为每个条目...找到相应的地图键!

答案 2 :(得分:0)

首先,ArrayMap隐式实现了键的排序。

基线:您需要迭代arrayMap以通过索引获取Key。然后通过该键调用值。

这是一个例子。我列出了未排序输入的排序输出。然后我反过来对keySet进行排序。

ArrayMap<String, String> arrayMap = new ArrayMap<>();
        arrayMap.put("AAA7", "BBB2");
        arrayMap.put("AAA8", "BBB1");
        arrayMap.put("AAA9", "BBB");
        arrayMap.put("AAA9", "BBB");// will override previous call

        String res = "";
        for (int i = 0; i < arrayMap.size(); i++) {
            String key = arrayMap.keyAt(i);
            res += arrayMap.get(key) + ", ";
        }

        Log.d(TAG, "normal output: " + res);

        // sorting array based on keys
        List<String> list = new ArrayList<>(arrayMap.keySet());
        java.util.Collections.reverse(list);//or you implement your own sort

        String res2 = "";
        for (String key : list) {
            res2 += arrayMap.get(key) + ", ";
        }

        Log.d(TAG, "output of sorted collection in reverse based on keys: " + res2);

为了提高效率,如果您不需要像Iteration这样的标准Java API,则可以使用SimpleArrayMap