我正在尝试按值排序地图。数据结构如下:
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()
输出它们答案 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;
}
}