1

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

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类型,我通过它们的默认比较来定义两个值之间的比较。本质上,我已经像这样组织数据:

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

4

1 回答 1

1

在调用 compare 方法时使用一个接受索引值 aa 配置参数的类来实现 Comparator 接口怎么样?并在 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;
    }
}
于 2013-09-18T21:00:44.853 回答