Java按地图中数组列表的第一个索引排序

时间:2013-11-18 08:17:34

标签: java sorting

我知道我可以使用TreeMap对Map进行排序,但我不知道如何按值排序,其中id是ArrayList的第一个索引。

以下是代码:

public void sort()
{
  Map<String, ArrayList<String>> m = new TreeMap<String,ArrayList<String>>();
  String[] name = new String[]{"first name", "second name", "third name"};
  String[] description = new String[]{"first description", "second description", "third description"};
  String[] id = new String[]{"1", "2", "3"};
  m.put(name[0], new ArrayList<String>(Arrays.asList(new String[]{description[0], id[0]})));
  m.put(name[1], new ArrayList<String>(Arrays.asList(new String[]{description[1], id[1]})));
  m.put(name[2], new ArrayList<String>(Arrays.asList(new String[]{description[2], id[2]})));
}

我试过这个来对地图进行排序:

SortedSet<Map.Entry<String, ArrayList<String>>> sortedset = new TreeSet<Map.Entry<String, ArrayList<String>>>(
          new Comparator<Map.Entry<String, ArrayList<String>>>() 
          {
              public int compare(Entry<String, ArrayList<String>> o1, Entry<String, ArrayList<String>> o2)
              {
                // return Integer.valueOf(o1.getValue()[1]).compareTo(Integer.valueOf(o2.getValue()[1]));
                return 0;
              } 
          });

3 个答案:

答案 0 :(得分:1)

TreeMap accepts a custom comparator也。您需要创建一个自定义Comparator并在TreeMap中将其传递为:

// assuming you create mycomparator
Map<String, ArrayList<String>> m = new TreeMap<String,ArrayList<String>>(mycomparator);

答案 1 :(得分:0)

你的问题有点令人困惑。 TreeMap由键自然“排序”(好吧,当你遍历它时,它会显示为有序)。

如果要按值中的第一项排序,则需要使用值中的第一项作为键,或者将所有值复制到可排序的集合中,例如, ArrayList,然后使用自定义Comparator排序,比较每个数组的第一个元素。

您还可以使用TreeSet与自定义Comparator比较每个数组中的第一项。然后将所有数组插入TreeSet

您可能还需要考虑使用数据作为字段而不是并行数组创建自定义类。然后该类可以实现Comparable,您可以按原样将其集合插入TreeSet,例如:

public class Item implements Comparable<Item> {

    private final String id;
    private String name;
    private String description;

    public Item (String id) {
        this.id = id; 
    }

    @Override public int compareTo (Item item) {
        // not shown for simplicity: check item, id, item.id for null.
        return id.compareTo(item.id);
    }

}

... {
    TreeSet<Item> items = new TreeSet<Item>();
    items.add(new Item(...));
    items.add(new Item(...));
    items.add(new Item(...));
    // items will be naturally sorted by item id.
}

在上面的示例中,您希望idfinal,以便在id位于集合中时无法更改Item,从而破坏了集合。

答案 2 :(得分:0)

您应该实现简单的类来保存信息然后使用集合,很容易对其进行排序并管理值。 然后使用Map对象,使用ID作为键,Map将自动排序,您可以使用自定义比较器按其他值对Map进行排序。

示例类

public class Obj{
    final int ID;
    String desctiption, name;
            public Obj(int _ID){
                    ID=_ID;
            }

    /**
     * @return the iD
     */
    public int getID() {
        return ID;
    }
    /**
     * @param iD the iD to set
     */
    public void setID(int iD) {
        ID = iD;
    }
    /**
     * @return the desctiption
     */
    public String getDesctiption() {
        return desctiption;
    }
    /**
     * @param desctiption the desctiption to set
     */
    public void setDesctiption(String desctiption) {
        this.desctiption = desctiption;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }



}

如果你想使用自定义比较器,你的类应该实现Comparable接口,然后使用这样的东西

   SortedSet<Map.Entry<int, Obj>> sortedset = new TreeSet<Map.Entry<int, Obj>>(
            new Comparator<Map.Entry<int, Obj>>() 
         {

             public int compare(Entry<int, Obj> o1, Entry<int, Obj> o2)
             {
                 return o1.getValue().compareTo(o2.getValue());
            } 
         });