【问题标题】:How to group List elements in Hashmap by a List of key如何通过键列表对 Hashmap 中的列表元素进行分组
【发布时间】:2015-02-05 04:09:38
【问题描述】:

我正在尝试使用 HashMap 将事件列表分组为日期,但我在实现它时遇到了问题。我希望日期成为关键,而事件将成为价值。所以每个匹配一个键的事件都将存储在 HashMap 的一个列表中。到目前为止,我有一个事件列表和一个列表日期.....我的代码如下所示,在此先感谢。

代码

public class TestMap {

public static void main(String[] args){
    TestMap test = new TestMap();

    List<Date> mDays = new ArrayList<Date>();
    SimpleDateFormat mFormat = new SimpleDateFormat("EEEE d MMMM yyyy");
    GregorianCalendar mCalendar = (GregorianCalendar)GregorianCalendar.getInstance();
    mCalendar.setTime(new Date());
     for (int i = 0; i < 7; i++){
            mDays.add(mCalendar.getTime());
            mCalendar.add(Calendar.DAY_OF_WEEK, 1);
           System.out.println("Date: " + mFormat.format(mDays.get(i)));

      }


    List<Events> mEvents = new ArrayList<Events>();
    mEvents.add( new Events("1", "boat party", "Sunday 7 December 2014"));
    mEvents.add( new Events("2", "church meeting", "Monday 8 December 2014"));
    mEvents.add( new Events("3", "shopping", "Saturday 13 December 2014"));
    mEvents.add( new Events("4", "clubbing", "Friday 12 December 2014"));
    mEvents.add( new Events("5", "visiting", "Thursday 11 December 2014"));
    mEvents.add( new Events("6", "tour", "Wednesday 10 December 2014"));
    mEvents.add( new Events("7", "work", "Tuesday 9 December 2014"));
    mEvents.add( new Events("1", "beckie birthday", "Sunday 7 December 2014"));
    mEvents.add( new Events("2", "camping", "Monday 8 December 2014"));
    mEvents.add( new Events("3", "gym", "Saturday 13 December 2014"));
    mEvents.add( new Events("4", "working", "Friday 12 December 2014"));
    mEvents.add( new Events("5", "farming", "Thursday 11 December 2014"));
    mEvents.add( new Events("6", "attend sales", "Wednesday 10 December 2014"));
    mEvents.add( new Events("7", "work", "Tuesday 9 December 2014"));

    for(Events evt: mEvents){

        System.out.println("ID: " +evt.getEventId()+ " Title: "+evt.getEventTitle()+ "   Date:    
  "+evt.getStartDate());
    }
}

}

事件类:

class Events{

private String eventId;
private String eventTitle;
private String startDate;

public Events(String eventId, String eventTitle, String startDate) {
    super();
    this.eventId = eventId;
    this.eventTitle = eventTitle;
    this.startDate = startDate;
}
public String getEventId() {
    return eventId;
}
public void setEventId(String eventId) {
    this.eventId = eventId;
}
public String getEventTitle() {
    return eventTitle;
}
public void setEventTitle(String eventTitle) {
    this.eventTitle = eventTitle;
}
public String getStartDate() {
    return startDate;
}
public void setStartDate(String startDate) {
    this.startDate = startDate;
}

}

【问题讨论】:

    标签: java android data-structures arraylist hashmap


    【解决方案1】:

    您可以使用HashMap&lt;Date,List&lt;Events&gt;&gt; 来实现此目的。

    你得到你的日期,对于每个日期对象,你都会得到一个List&lt;Events&gt; 对象。获取此对象(如果不存在则为 NULL)后,您将能够添加/删除事件,然后使用 put 方法再次存储它们。

    希望对你有帮助

    编辑

    你会在你的类中声明这样的东西:

    HashMap<Date,List<Events>> my_events = new HashMap<Date,List<Events>>();
    

    让我们举几个例子。

    1 - 将事件添加到某个日期:

     //suppose that you already have a date in which you want to add the new event
    
     if(my_events.contains(given_date))
     {
         List<Events> aux = my_events.get(given_date);
         aux.add(new_event);
         my_events.put(given_date,aux);
     }
     else
     {
        List<Events> new_list = new ArrayList<Event>();
        new_list.add(new_event);
        my_events.put(given_date,new_list);
    
     }
    

    2 - 您想获取给定日期的所有事件:

    return my_events.get(given_date); // this will return null if the given date (key) does not exists
    

    【讨论】:

    • 感谢 zozelfelfo,它有点帮助,但您能否添加代码 sn-p 以获得更多说明。
    • 如果这解决了您的问题,请将答案视为正确,否则请评论您需要的任何内容@mish :)
    【解决方案2】:

    假设您按 ID 字段对项目进行分组,

    // create a map which relates String-List of Event mapping
    HashMap<String, List<Event>> listMap=new HashMap<String,List<Event>>();
    
    // loop through the events
    for(Events evt: mEvents){
        if(!listMap.containsKey(evt.getID())){
            listMap.put(evt.getID(), new ArrayList<Event>());
        }
        listMap.get(evt.getID()).add(evt);
    }
    
    // if you want to get a list of all events with the same ID,
    Collection<Event> eventWithSpecificId=listMap.get("certain ID");
    

    【讨论】:

    • 请添加一些解释。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多