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
的字符串属性