使用每个键

时间:2018-04-03 15:28:29

标签: java hashmap iteration

我目前正在通过大学学习集合和地图(仍在使用Java 7)。

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

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

我需要想出一种方法来检查HashMap是否存在今天到期的任何任务。所以我需要能够只查询aDate局部变量所归属的HashMap值。

我知道迭代地图,我可以将键或值放入一个集合,然后迭代集合 - 不是问题。但是如果我使用values()方法(在Map类中)将它们放入一个集合中 - 它将每个键的所有三个字符串放入集合中。我只想将aDate值移动到一个集合中。

有什么想法吗?

我似乎只能找到地图只有一个Key和Single Value的示例。此列表具有单个键和每个键三个值。

任何指针都会好吗?

亲切的问候

编辑.....

以为我会添加一些代码来帮助,因为有几种不同的方法 - 我非常感谢。但不确定它们是否符合我的需求......

Job Class是这样构建的......

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

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

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

所以我需要知道迭代这个地图的最佳方法,但是只有Job属性'aDate'可能会保留我之后的值。

不确定这是否有帮助?

亲切的问候

3 个答案:

答案 0 :(得分:1)

如果真的唯一允许使用的结构是一个Map,其中每个键有3个值(如果我理解的话就是这种情况),其中只有一个是Date,你在技术上可以做到以下几点:

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

其他建议的解决方案虽然设计明智得多。

答案 1 :(得分:0)

只需创建一个包含所需数据的类。例如。 如果你需要像Map<String, Tuple<String, Integer, Date>>那样奇怪的东西,只需创建一个包含元组的新类:

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

    // get/set here...
}

并使用它:Map<String, TupleHolder>

答案 2 :(得分:0)

如果你不能像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>交换。