我有一个对象列表。
例如>
的groupId = 1 命名= NAME1
的groupId = 1 命名= NAME2
的groupId = 1 命名= NAME3
的groupId = 2 命名= NAME4
List中的多个对象具有groupId
的相同值。我需要创建具有相同groupId
的对象的子列表。我如何用Java做到这一点。
我的初学者想法是创建HashMap<Integer,List<Object>>
,但我不确定groupIds
的无限期值,这反过来让我不确定如何将具有相同groupIds
的对象组合在一起使用groupId
作为hashmap的密钥。
如果groupId未来不会改变或增加,我可以迭代原始列表并编写一个switch语句来创建所需的数组。
答案 0 :(得分:6)
使用Java 8,您可以使用the groupingBy
collector:
Map<String, List<MyObject>> map = list.stream()
.collect(Collectors.groupingBy(MyObject::getGroupId));
答案 1 :(得分:2)
LinkedHashMap<K,V>
因为我必须保留我根据对象的优先级值属性排序的对象的顺序。
LinkedHashMap<Group, List<Object>> hashMap=new LinkedHashMap<Group, List<Object>>();
for(Object model:objects){
if(!hashMap.containsKey(model.getGroup())){
List<Object> list= new ArrayList<Object>();
list.add(model);
hashMap.put(Group,list);
}
else{
hashMap.get(model.getGroup()).add(model);
}
答案 2 :(得分:1)
我认为你需要这样的地图 -
Map map = new HashMap<Integer, List<String>>();
key
中的HashMap
Integer
代表您的groupId
(即 - 1,2,3等)和value
(即 - 存储在HashMap
List
String
的{{1}}的name1,name2等)。
您可以使用以下步骤 -
1。:对您的四个列表进行迭代
2. :根据键groupId将每个项目添加到Map
构造(例如,此处map
)。
我认为this link在这种情况下会有所帮助。
答案 3 :(得分:1)
在 Java 8 中,您可以使用一些过滤器。
public class A {
public int groupId;
public String name;
public A(int groupId, String name) {
this.groupId = groupId;
this.name = name;
}
}
使用Collections API进行过滤
ArrayList<A> list=new ArrayList();
list.add(new A(2, "tom"));
list.add(new A(2, "rome"));
list.add(new A(1, "sam"));
List<A> filteredlist = list.stream().filter(p -> p.groupId==2).collect(Collectors.toList());