对具有hashMap值元素的集合的元素进行排序 - UnsupportedOperation Exception

时间:2017-04-28 09:14:21

标签: java sorting hashmap

我有一种排序方法可以对不同类型的集合进行排序。我尝试对一个集合,一个ArrayList,一个列表和一个HashMap值的集合进行排序。除了返回UOE的hashMap.values()集合之外,所有集合都已正确排序。我调试了代码并且问题在线:“numbers.add(a[k]);”您是否知道如何使我的排序方法成功排序hashMap.values()集合? 这是代码:

public void sort(Collection<NamedValue> numbers)

{
    try
    {
        NamedValue[] a = numbers.toArray(new NamedValue[numbers.size()]) ; 
        boolean swapped = true;
        int j = 0;
        NamedValue temp;
        while (swapped) {
            swapped = false;
            j++;
            for (int i = 0; i < a.length - j; i++) {
                if (a[i] != null && a[i].compareTo(a[i+1]) == 1)
                {
                    temp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = temp;
                    swapped = true;
                }
            }   
        } 
        numbers.clear();
        for (int k=0; k<a.length; k++) {
            numbers.add(a[k]);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

主要代码:

    List<NamedValue> numbers = Arrays.asList(new NamedValue("One", 1), /**/
            new NamedValue("Three", 3), /**/
            new NamedValue("Four", 4), /**/
            new NamedValue("Two", 2), /**/
            new NamedValue("Five", 5));

    Map<String, NamedValue> numbersMap = new HashMap<String, NamedValue>();
    for (NamedValue value: numbers)
        numbersMap.put(value.Name(), value);
    System.out.println("numbersMap = " + numbersMap);

    Map<String, Collection<NamedValue>> collections = new HashMap<String, 
    Collection<NamedValue>>();
    collections.put("ArrayList", numbersArrayList);
    collections.put("List", numbersList);
    collections.put("Set", numbersSet);
    collections.put("Map values", numbersMap.values());

    for (String key: collections.keySet())
    {
        Collection<NamedValue> coll = collections.get(key);
        lab.sort(coll);
        System.out.println("Sorted " + key + " = " + coll);
    }

所以我有一个HashMap集合,对于这个地图中的每个Collection,我想对元素进行排序。其中一个集合由numbersMap集合的值组成。如何使我的排序方法对所有这些集合(hashMap.values()集合)进行排序?

2 个答案:

答案 0 :(得分:1)

您无法将项目添加到地图的值集合

从java.util.HashMap.values()操作的java文档:

  

Collection java.util.HashMap.values()   返回此映射中包含的值的Collection视图。该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。该集合支持元素删除,它通过Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。   它不支持add或addAll操作。

答案 1 :(得分:-1)

方案在HashMap方面有所不同,因为在hashmap中我们采用值键对,因此如果需要对哈希映射进行排序,我们可以根据键对其进行排序。 Arraylist或List不在键值表单中,因此您的排序方法可以在那里运行。