Java 如何在hashmap中按相同键的元素对列表进行排序

Java 如何在hashmap中按相同键的元素对列表进行排序,java,arraylist,hashmap,Java,Arraylist,Hashmap,我正在尝试制作一个哈希映射,其中包括对象的名称(键),以及具有该名称的所有对象的列表。大概是这样的: "bob" = obj1, obj2 "Mark" = obj3 我创建了一个排序方法来尝试并完成此操作,但我无法使其工作: public class sorter { public static Object obj = new Object("mark"); public static Object obj1 = new Object("bob"); publi

我正在尝试制作一个哈希映射,其中包括对象的名称(键),以及具有该名称的所有对象的列表。大概是这样的:

"bob" = obj1, obj2

"Mark" = obj3
我创建了一个排序方法来尝试并完成此操作,但我无法使其工作:

public class sorter {

    public static Object obj = new Object("mark");
    public static Object obj1 = new Object("bob");
    public static Object obj2 = new Object("mark");
    public static Object obj3 = new Object("mark");

    public static List<Object> objects = new ArrayList<Object>();

    private static Map<String, List<Object>> map = new HashMap<String, List<Object>>();

    public static List<Object> tempList = new ArrayList<Object>();

    public static String key;
    public static int values;

    public static void sort(List<Object> objects) {

        for(int i = 0; i<objects.size(); i++) {

            key = objects.get(i).getName();
            if(map.containsKey(key)) {
                map.get(key).add(objects.get(i));
            }
            else {
                tempList.add(objects.get(i));
                map.put(key, tempList);
            }
            //reset
            //key = null;
        }
    }

    public static void main(String[]args) {
        objects.add(obj);
        //objects.add(obj1);
        //objects.add(obj2);
        //objects.add(obj3);
        sort(objects);
        System.out.println(map.get("mark"));
    }
}
公共类分拣机{
公共静态对象obj=新对象(“标记”);
公共静态对象obj1=新对象(“bob”);
公共静态对象obj2=新对象(“标记”);
公共静态对象obj3=新对象(“标记”);
public static List objects=new ArrayList();
private static Map=new HashMap();
public static List templast=new ArrayList();
公共静态字符串密钥;
公共静态int值;
公共静态无效排序(列出对象){

对于(int i=0;i,您的代码目前有几个问题。让我们来分析一下:

  • 你不是在分类,而是在分组
  • 调用类
    sorter
    不是一个有意义的名称,并且不遵循java命名约定
  • 新对象(“标记”);
    不会编译,因为
    对象
    类只有一个构造函数,它是默认构造函数,不带参数
  • objects.get(i).getName();
    将不会编译,因为对象类中没有
    getName
    方法
  • 尽量避免使用
    对象
    类,在这种情况下,创建
    类更有意义
  • 例如:

    class Person {
        private String name;
        // ... some additional fields
        @Override
        public String toString() {
            return "Person1{" +
                    "name='" + name + '\'' +
                    '}';
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    然后您的
    分拣机
    类变为:

    class Grouping {
    
        public static Person obj = new Person("mark");
        public static Person obj1 = new Person("bob");
        public static Person obj2 = new Person("mark");
        public static Person obj3 = new Person("mark");
    
        public static List<Person> objects = new ArrayList<>();
    
        private static Map<String, List<Person>> map = new HashMap<>();
    
        public static void groupByName(List<Person> objects) {
           map = objects.stream().collect(Collectors.groupingBy(Person::getName));
           // group by the person name
        }
    
    
        public static void main(String[]args) {
            objects.add(obj);
            objects.add(obj1);
            objects.add(obj2);
            objects.add(obj3);
            groupByName(objects);
            System.out.println(map.get("mark"));
        }
    }
    
    类分组{
    公共静态人员obj=新人员(“标记”);
    公共静态人员obj1=新人员(“bob”);
    公共静态人员obj2=新人员(“标记”);
    公共静态人员obj3=新人员(“标记”);
    public static List objects=new ArrayList();
    private static Map=new HashMap();
    公共静态void groupByName(列出对象){
    map=objects.stream().collect(Collectors.groupingBy(Person::getName));
    //按人名分组
    }
    公共静态void main(字符串[]args){
    对象。添加(obj);
    对象。添加(obj1);
    objects.add(obj2);
    添加(obj3);
    groupByName(对象);
    System.out.println(map.get(“mark”);
    }
    }
    
    您可以使用如下Java8流:

        public static void sort(List<Object> objects) {
           map =objects.stream().collect(Collectors.groupingBy((o) -> o.getName()));
        }
    
    公共静态无效排序(列出对象){
    map=objects.stream().collect(Collectors.groupingBy((o)->o.getName());
    }
    
    到底出了什么问题?
    tempList
    应该在循环中声明/创建(在
    else
    块中)。这不是排序(在编程中也称为排序),而是分组Guava Multimap是您需要的:假设OP没有使用自己的
    对象
    类和一个名为
    name
    的字符串属性