繁体   English   中英

在每个键具有多个值的HashMap上进行迭代

[英]Iterate over a HashMap with multiple values per key

我目前正在大学中学习设置和地图(仍然使用Java 7)。

他们给了我们一半完成的待办事项清单应用程序。 当前,待办事项列表使用三个String局部变量来允许用户声明作业(aJob),执行该作业的时间(aTime)和执行该作业的日期(aDate)。

该应用程序还具有一个实例变量(今天),该变量保存今天的日期。

我需要想出一种方法来检查HashMap是否有今天到期的任何任务。 因此,我需要能够仅查询aDate局部变量赋予的HashMap值。

我知道,要迭代Maps,可以将键或值放入Set中,然后在Set上进行迭代-没问题。 但是,如果我使用values()方法(在Map类中)将它们放入集合中,则它将每个键将所有三个String放入集合中。 我只想将aDate值移动到集合中。

有任何想法吗?

我似乎只能找到Maps只有一个键和一个值的示例。 该列表有一个键,每个键三个值。

任何指针都会很好吗?

亲切的问候

编辑.....

只是想我会添加一些代码来提供帮助,因为有几种不同的方法-我都非常满意。 但是不确定它们是否满足我的需求。

作业类就是这样构造的...

public Job(String aJob, String aDate, String aTime)
{
  Job = aJob;
  date = aDate;
  time = aTime;
}

然后,在待办事项列表类的实例声明中创建地图。

Map<Integer, Job> toDoList = new HashMap<>();

因此,我需要知道遍历此映射的最佳方法,但是可能只有Job属性'aDate'可以保存我想要的值。

不确定是否有帮助?

亲切的问候

如果确实允许您使用的唯一结构是Map,其中每个键都有3个值(如果我正确理解的话就是这种情况),其中只有一个是Date,从技术上讲,您可以执行以下操作:

map.values()
    .stream()
    .filter(Date.class::isInstance)
    ...whatever else you want to do

从设计角度来看,其他建议的解决方案要好得多。

只需创建一个包含所需所有数据的类。 例如,如果您需要诸如Map<String, Tuple<String, Integer, Date>>类的奇怪东西Map<String, Tuple<String, Integer, Date>>只需创建一个包含Tuple的新类:

    class TupleHolder {
    private String firstValue;
    private Integer secondValue;
    private Date thirdValue;

    // get/set here...
}

并使用它: Map<String, TupleHolder>

如果您不能使用Toisen建议的自定义类,则HashMap<String, HashMap<String, ArrayList<String>>>可能为您解决了问题。

我添加了一个使用方法的示例(以及一些随机数据的填充)

public class FunkyMap {
    private HashMap<String, HashMap<String, ArrayList<String>>> jobs;

    // For random data
    private String[] job = {"EAT", "SLEEP", "FART", "RELAX", "WORK"};
    private String[] time = {"MORNING", "BEFORENOON", "NOON", "AFTERNOON", "EVENING", "MIDNIGHT"};
    private String[] date = {"FIRST", "SECOND", "THIRD", "FOURTH"};

    public FunkyMap() {
        jobs = new HashMap<>();

        // To populate some random data
        Random r = new Random();
        for(int i = 0; i < 20; i++) {
            String d = date[r.nextInt(date.length)];

            if(jobs.containsKey(d)) {
                HashMap<String, ArrayList<String>> inner = jobs.get(d);
                String t = time[r.nextInt(time.length)];

                if(inner.containsKey(t)) {
                    inner.get(t).add(job[r.nextInt(job.length)]);
                } else {
                    List<String> s = Arrays.asList(new String(job[r.nextInt(job.length)]));
                    inner.put(t, new ArrayList<String>(s));
                }
            } else {
                jobs.put(d, new HashMap<String, ArrayList<String>>());
            }
        }

        // Actual iteration over date => time => jobs
        Iterator<String> i = jobs.keySet().iterator();
        while(i.hasNext()) {
            String iKey = i.next();
            HashMap<String, ArrayList<String>> inner = jobs.get(iKey);

            System.out.println("Jobs scheduled for " + iKey);

            Iterator<String> j = inner.keySet().iterator();
            while(j.hasNext()) {
                String jKey = j.next();
                ArrayList<String> actualJobs = inner.get(jKey);

                System.out.println("\tAt " + jKey);

                for(String s : actualJobs) {
                    System.out.println("\t\tDo " + s);
                }
            }
        }
    }

    public static void main(String[] args) {
        new FunkyMap();
    }
}

我自由地假设日期是唯一的,而每个日期的时间是唯一的,而时间可以容纳任何数量的工作,包括重复的工作。 如果对作业的最后一个假设不正确,则可以将ArrayList<String>Set<String>交换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM