对Map的列表进行排序<string,string =“”> </string,>

时间:2014-09-05 12:52:56

标签: java sorting collections

我看到了这个帖子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)
  ...
}

3 个答案:

答案 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