簡體   English   中英

如何從一個自定義 object 列表中創建一個 HashMap,它將 String 作為鍵,值將是另一個 HashMap?

[英]How to create a HashMap that would have String as key and the value would be another HashMap from one list of custom object?

我有一個自定義 object 的列表,

public class Assignmentsdata {

    String assignmentId;
    String teacherId;
    String groupName;
    String sectionId;
    String levelId;
    String startTime;
}

ArrayList<Assignmentsdata> list = new ArrayList<>();

假設該列表中有 20 個元素。

現在我想獲得 output ,它是 startTime 的 hashmap 作為鍵,值將是新的 HashMap 的 GroupID 和具有相同組名的分配列表。

OutPut 示例

HashMap<startTime,HasMap<groupName,List> hashMap = new HashMap();

關於這個問題的更多見解:首先我想根據 startTime(Month) 進行分類,然后我想根據 groupName 進行分類,提前致謝。

我已經根據組名成功分類並通過以下代碼創建了 map:

 for( int i = 0; i<assignmentsdataArrayList.size();i++ ){
                if (hashMap.size()>0){
                    hashMap.get(assignmentsdataArrayList.get(i).getGroupName()).add(assignmentsdataArrayList.get(i));
                }else {
                    hashMap.put(assignmentsdataArrayList.get(i).getGroupName(),new ArrayList<Assignmentsdata>());
                    hashMap.get(assignmentsdataArrayList.get(i).getGroupName()).add(assignmentsdataArrayList.get(i));
                }
            }

After that I am lost on how to categorise this hashmap based on the startDate and create a hashmap that would look like the above hashmap in the output heading.

您的代碼可能會在第一個 if 分支上拋出 NullPointerException

 if (hashMap.size()>0)
{hashMap.get(assignmentsdataArrayList.get(i).getGroupName()).add(assignmentsdataArrayList.get(i));
 }

map.size()>0 並不意味着 GroupName 的值已經放置了一個新的 ArrayList。

使用循環的答案應該是這樣的

   Map<String, Map<String, List<Assignmentsdata>>> map = new HashMap<>();
        for (Assignmentsdata assignmentsdata : list) {
            if (!map.containsKey(assignmentsdata.getStartTime())) {
                map.put(assignmentsdata.getStartTime(), new HashMap<>());
            }
            Map<String, List<Assignmentsdata>> startTimeMap = map.get(assignmentsdata.startTime);
            if (!startTimeMap.containsKey(assignmentsdata.getGroupName())) {
                startTimeMap.put(assignmentsdata.getGroupName(), new ArrayList<>());
            }
            startTimeMap.get(assignmentsdata.groupName).add(assignmentsdata);
        }

或者您可以使用 java stream().collect(Collectors.groupingBy()) api 輕松獲得結果

Map<String, Map<String, List<Assignmentsdata>>> result = list.stream()
            .collect(Collectors.groupingBy(Assignmentsdata::getStartTime,Collectors.groupingBy(Assignmentsdata::getGroupName)));

我正在回答我自己的問題,因為我解決了如果有人有更好的答案,請也通過你的答案,我不接受另一個合適且有效的答案。

            for( int i = 0; i<assignmentsdataArrayList.size();i++ ){
                if (hashMap.size()>0){
                    if (hashMap.get(assignmentsdataArrayList.get(i).getGroupName())==null){
                        hashMap.put(assignmentsdataArrayList.get(i).getGroupName(),new ArrayList<Assignmentsdata>());
                        hashMap.get(assignmentsdataArrayList.get(i).getGroupName()).add(assignmentsdataArrayList.get(i));
                    }else{
                        hashMap.get(assignmentsdataArrayList.get(i).getGroupName()).add(assignmentsdataArrayList.get(i));
                    }

                }else {
                    hashMap.put(assignmentsdataArrayList.get(i).getGroupName(),new ArrayList<Assignmentsdata>());
                    hashMap.get(assignmentsdataArrayList.get(i).getGroupName()).add(assignmentsdataArrayList.get(i));
                }
            }

// 上面的部分已經在問題中了。 第二部分我遍歷 hashMap 然后再次列表,並檢查列表和 map 條目是否具有相同的組名,然后從列表中創建索引元素的 startdate 鍵。

            HashMap<String, Map.Entry<String, ArrayList<Assignmentsdata>>> hashMapHashMap = new HashMap<>();
            for (var entry : hashMap.entrySet()){
                for( int j = 0; j<assignmentsdataArrayList.size();j++ ){
                     if (assignmentsdataArrayList.get(j).getGroupName()==entry.getKey()){
                        hashMapHashMap.put(assignmentsdataArrayList.get(j).getStartTime(),entry);
                    }
                }
               hashMapHashMap.put(entry.getValue().get())

            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM