Java:当值是一个arraylist时,按值对Map进行排序

时间:2013-09-18 19:54:45

标签: java sorting map arraylist

我正在尝试按值排序地图。数据结构如下:

Map<String, ArrayList<Object>>

ArrayList包含一组对象的属性,这些对象的名称对应于地图中的字符串键值。

我的想法是我想按属性对这些对象进行排序。因此,假设透明度是这些对象的属性,透明度存储在ArrayList.get(3)中,用于所有对象。

我如何能够以这样的方式对其进行排序:

我能够输出:

Transparency     Object Name
   Value            Name 1
   Value            Name 2
   Value            Name 3 
   Value            Name 4

我尝试了几种不同的类型,似乎没有任何工作。 有任何想法吗?

编辑: 更多信息。

arrayList中的对象都是Double类型或String类型,我通过默认比较来定义两个值之间的比较。基本上,我已经组织了这样的数据:

其属性包含在列表中的对象的名称是地图的关键字。键给出的值是该对象的属性列表。我想比较属性(i),其中我是用户输入,对象A与对象B的属性(i),然后使用System.out.print()或printf()

输出它们

1 个答案:

答案 0 :(得分:1)

如何使用接受索引值的类来实现Comparator接口,以及在调用compare方法时使用的config参数?并在map.entrySet()上排序?

例如:

   import java.util.*;

public class AClass {

    static Map<String, List<Object>> myMap = new HashMap<>();
    static final int ALPHA_ZULU = 0;
    static final int SOME_DOUBLE = 1;

    public static void main(String[] args) {

        List<Object> l1 = new ArrayList<>();
        l1.add("CHARLIE");
        l1.add(new Double(1));
        List<Object> l2 = new ArrayList<>();
        l2.add("ZULU");
        l2.add(new Double(9));
        List<Object> l3 = new ArrayList<>();
        l3.add("ALPHA");
        l3.add(new Double(12));
        List<Object> l4 = new ArrayList<>();
        l4.add("XRAY");
        l4.add(new Double(4));

        myMap.put("one", l1);
        myMap.put("two", l2);
        myMap.put("three", l3);
        myMap.put("four", l4);


        List<Map.Entry<String, List<Object>>> meList = new ArrayList<>(myMap.entrySet());
        Collections.sort(meList, new MyComaprator(ALPHA_ZULU));

        for(Map.Entry me : meList) {
            System.out.println(me.getKey() + " = " + me.getValue());
        }

    }






}


class MyComaprator implements Comparator<Map.Entry<String,List<Object>>> {

    final int compareIndex;

    public MyComaprator(int compareIndex) {
        this.compareIndex = compareIndex;
    }

    @Override
    public int compare(Map.Entry<String, List<Object>> me1, Map.Entry<String, List<Object>> me2) {

        Object item1 = me1.getValue().get(compareIndex);
        Object item2 = me2.getValue().get(compareIndex);
        int compareResult = 0;

        if(item1 instanceof String && item2 instanceof String) {
            compareResult = ((String)item1).compareTo((String)item2);
        } else if(item1 instanceof Double && item2 instanceof Double) {
            compareResult = (int)((double)item1 - (double)item2);
        } else {
            // invalid comparison perhaps?
        }

        return compareResult;
    }
}