我看到了这个帖子sorting a List of Map<String, String>,我知道我听起来有点重复,但它有点不同。
我的例子是:
List<Map<String, String>> myList = new ArrayList<Map<String, String>>();
...
for(MyClass1 c1 : c1)
{
...
for(MyClass2 c2 : c12)
{
SimpleBindings myBindindings= new SimpleBindings();
myBindindings.put(c1.getName(), c2.getName());
myList.add(myBindindings);
}
}
...
具体来说,我可以
{
(John, Mike)
(John, Jack)
(Sam, Jack)
(Gloria, Anna)
(Jane, Carla)
...
}
并希望我的列表按地图键排序:
{
(Gloria, Anna)
(Jane, Carla)
(John, Mike)
(John, Jack)
(Sam, Jack)
...
}
答案 0 :(得分:1)
你确定吗
List<Map<String, String>>
是您想要的 approriate数据类型?
对我来说,看起来你实际上正在寻找简化
TreeMap<String, String>
即。有序地图键 - &gt;值?
或者您的意思是使用List<StringPair>
(为此,请选择比StringPair
更合适的名称,并根据您的需要实施该类)?我的印象是,在Java中缺少明显的Pair<String, String>
类时,您已经滥用 SimpleBinding
作为配对类。在Java中使用对的正确方法是实现一个具有适当类名的新类 - &#34; pair&#34;是技术性的,而不是语义性的。
您也可以
List<String[]>
并实施Comparator<String[]>
进行排序。但是,这并不能为您节省任何实施NamePair
课程并使其与自己相媲美的工作。
答案 1 :(得分:0)
您需要实现Comparator才能完成此任务......
Collections.sort(myList, new Comparator<ObjectBeingCompared>() {
@Override
public int compare(ObjectBeingCompared obj1, ObjectBeingCompared obj2) {
//Of course you will want to return 1, 0, -1 based on whatever you like
//this is just a simple example
//return 1 if obj1 should be ordered first
//return 0 if obj1 and obj2 are the same
//return -1 if obj1 should be ordered after obj2
return obj1.compareTo(obj2);
}
});
答案 2 :(得分:-1)
HashMap数据结构用于允许在O(1)时间内访问其元素。
因为它是数据的容器,所以它的池或密钥可以随时间变化。这意味着您无法确保长期以来的地图列表顺序。
在您的示例中,您匹配两个字符串并创建名为SimpleBindings
的数据对。
如果是简单示例,则不应使用Map<String,String>
数据结构来表示Pair
数据。
如果SimpleBindings真的由两个字符串组成,那么你必须做的一切只是在SimpleBindings类中实现Comparable,如下所示:
class SimpleBinding implements Comparable<SimpleBinding> {
private final String key;
private final String value;
public SimpleBinding(String key, String value) {
Objects.nonNull(key);
Objects.nonNull(value);
this.key = key;
this.value = value;
}
@Override
public int compareTo(SimpleBinding that) {
return this.key.compareTo(that.key);
}
}
你只需使用Collections.sort(bindings )
来排序结果。
如果您无法访问该课程,则应使用Comparator界面,如此
enum SimpleBindingComparator implements Comparator<SimpleBinding> {
DEFUALT {
@Override
public int compare(SimpleBinding fist, SimpleBinding second) {
return fist.key.compareTo(second.key);
}
};
然后按照此Collections.sort(bindings ,SimpleBindingComparator.DEFAULT);
但是如果您的情况比这更复杂并且您在列表中存储了Map,则应该定义表示顺序的逻辑。在您的情况下,订单必须由c1.getName()
一种选择是你不应该创建一个List而是一个列表Map<String>,List<String>>
的映射,这就是所谓的多映射,其中一个键与多个值匹配。请参阅番石榴的MultiMap,如果您希望对其进行分类,那么我建议您阅读TreeMultiMap