【问题标题】:Java: Sorting a Map by the value, when value is an arraylist [duplicate]Java:当值是数组列表时,按值对地图进行排序[重复]
【发布时间】:2013-09-18 19:54:45
【问题描述】:

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

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() 输出它们

【问题讨论】:

标签: java sorting map arraylist


【解决方案1】:

如何使用一个类来实现 Comparator 接口,该类接受一个索引值和一个配置参数,以便在调用 compare 方法时使用?并在 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;
    }
}

【讨论】:

  • 我已经尝试过类似的事情,但我遇到了一个问题,即这不被接受为覆盖。我的确切代码标题是:public > int compare(Map.Entry> map1, Map.Entry> map2) { ... }
  • @user130173 我已经编辑了我提供的示例,并提供了一个工作示例。用 ALPHA_ZULU (0) 构造 MyComparator,它将按值列表的索引 0 排序。使用 1 按 1 索引排序。如果您不在 Java7 上,则需要在菱形运算符中复制泛型类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多