首页 > 解决方案 > 根据代码中的某些条件优雅地将对象添加到 HashMap

问题描述

我目前正在用 Java 构建日历应用程序。我决定采取的路线是保留一个日历月视图(内置 JavaFX)并更改日期。由于每个月通常有不同的第一天,因此每次月份更改时都必须将日期重新添加到日历中。我决定使用 Hashmap,我根据每月的第一天添加每月的天数。然后我可以在我的代码中使用这个 Hashmap 来做一些事情,改变应用程序端的文本字段等等。

我提交的代码是我如何将日期添加到哈希图中的基本版本,然后打印它们(以显示它们用于测试目的的日期)。

然而,我的方法似乎很啰嗦,如果我有一个包含 10000 个 Hashmap 条目的程序,那么这种方法将不实用。

我的问题如下:是否有更优雅的方法来向 Hashmap 添加条目,其中条目的添加取决于代码中的某些条件?

import java.util.HashMap;
import java.util.Set;

public class MyMonth {

    public static void main(String[] args) {

        addDaysFromFirstDayOfWeek(list);

        int localcount = 1;

        Set<Integer> hashset = list.keySet();

        for (Integer key : hashset) {

            String day = list.get(key);
            System.out.println( day + " is day " + localcount + " in the month " );
            localcount ++;
        }
    }


    static int count = 1;
    static int Daysinmonth = 30;

   


    public static HashMap<Integer, String> list = new HashMap<>(Daysinmonth);



    //Week 1
    static String Monday1 = "Monday1";
    static String Tuesday1 = "Tuesday1";
    static String Wednesday1 = "Wednesday1";
    static String Thursday1 = "Thursday1";
    static String Friday1 = "Friday1";
    static String Saturday1 = "Saturday1";
    static String Sunday1 = "Sunday1";

    // Week 2
    static String Monday2 = "Monday2";
    static String Tuesday2 = "Tuesday2";
    static String Wednesday2 = "Wednesday2";
    static String Thursday2 = "Thursday2";
    static String Friday2 = "Friday2";
    static String Saturday2 = "Saturday2";
    static String Sunday2 = "Sunday2";






    static String FirstDayOfWeek = Tuesday1;





    public static void addDaysFromFirstDayOfWeek(HashMap<Integer,String> hashMap) {


        if (FirstDayOfWeek.equals(Monday1)) {
            hashMap.put(count, Monday1);
            count++;
            hashMap.put(count, Tuesday1);
            count++;
            hashMap.put(count, Wednesday1);
            count++;
            hashMap.put(count, Thursday1);
            count++;
            hashMap.put(count, Friday1);
            count++;
            hashMap.put(count, Saturday1);
            count++;
            hashMap.put(count, Sunday1);
            count++;
            addDaysToArrayList(hashMap);



        } else if (FirstDayOfWeek.equals(Tuesday1)) {
            hashMap.put(count, Tuesday1);
            count++;
            hashMap.put(count, Wednesday1);
            count++;
            hashMap.put(count, Thursday1);
            count++;
            hashMap.put(count, Friday1);
            count++;
            hashMap.put(count, Saturday1);
            count++;
            hashMap.put(count, Sunday1);
            count++;
            addDaysToArrayList(hashMap);

        } else if (FirstDayOfWeek.equals(Wednesday1)) {
            hashMap.put(count, Wednesday1);
            count++;
            hashMap.put(count, Thursday1);
            count++;
            hashMap.put(count, Friday1);
            count++;
            hashMap.put(count, Saturday1);
            count++;
            hashMap.put(count, Sunday1);
            count++;
            addDaysToArrayList(hashMap);
        } else if(FirstDayOfWeek.equals(Thursday1)){
            hashMap.put(count, Thursday1);
            count++;
            hashMap.put(count, Friday1);
            count++;
            hashMap.put(count, Saturday1);
            count++;
            hashMap.put(count, Sunday1);
            count++;
            addDaysToArrayList(hashMap);
        } else if(FirstDayOfWeek.equals(Friday1)){
            hashMap.put(count, Friday1);
            count++;
            hashMap.put(count, Saturday1);
            count++;
            hashMap.put(count, Sunday1);
            count++;
            addDaysToArrayList(hashMap);
        } else if(FirstDayOfWeek.equals(Saturday1)){
            hashMap.put(count, Saturday1);
            count++;
            hashMap.put(count, Sunday1);
            count++;
            addDaysToArrayList(hashMap);
        } else if(FirstDayOfWeek.equals(Sunday1)){
            hashMap.put(count, Sunday1);
            count++;
            addDaysToArrayList(hashMap);
        }


    }

    public static void addDaysToArrayList(HashMap<Integer,String> hashMap){

        hashMap.put(count,Monday2);
        count++;
        hashMap.put(count,Tuesday2);
        count++;
        hashMap.put(count,Wednesday2);
        count++;
        hashMap.put(count,Thursday2);
        count++;
        hashMap.put(count,Friday2);
        count++;
        hashMap.put(count,Saturday2);
        count++;
        hashMap.put(count,Sunday2);
        count++;

    }


}

标签: javahashmapadd

解决方案


我会使用流来完成这项工作。以下是为一年中的所有月/日构建地图的方法示例:

Map<Month, Map<Integer, DayOfWeek>> getMonthDaysOfWeek(int year) {
    return EnumSet.allOf(Month.class).stream()
            .map(month -> Year.of(year).atMonth(month))
            .collect(Collectors.toMap(
                    YearMonth::getMonth, 
                    yearMonth -> IntStream.rangeClosed(1, yearMonth.lengthOfMonth()).boxed()
                            .collect(Collectors.toMap(Function.identity(), 
                                    day -> yearMonth.atDay(day).getDayOfWeek()))));
}

推荐阅读