繁体   English   中英

从 Hashmap 中删除元素

[英]Removing elements from a Hashmap

从 HashMap 中删除元素

我需要在 HashMap 中添加 10 个元素; 姓名和出生日期。

removeAllSummerPeople 应该删除所有在六月、七月或八月出生的人。

非常不清楚需要做什么。

    public static HashMap<String, Date> createMap() throws ParseException {
        DateFormat df = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
        HashMap<String, Date> map = new HashMap<String, Date>();
        map.put("Stallone", df.parse("JUNE 1 1980"));

        //write your code here
        map.put("a", df.parse("JUNE 1 1980"));
        map.put("b", df.parse("JUNE 1 1980"));
        map.put("c", df.parse("JUNE 1 1980"));
        map.put("d", df.parse("JUNE 1 1980"));
        map.put("e", df.parse("JUNE 1 1980"));
        map.put("f", df.parse("JUNE 1 1980"));
        map.put("g", df.parse("JUNE 1 1980"));
        map.put("h", df.parse("JUNE 1 1980"));
        map.put("i", df.parse("JUNE 1 1980"));


        return map;

    }

    public static void removeAllSummerPeople(HashMap<String, Date> map) {
        //write your code here
        for(HashMap.Entry<String, Date> pair : map.entrySet()){
            int x = pair.getValue().getMonth();
            if (x>=6 && x<=8){
                map.remove(pair.getKey());
            }

        }


    }

它闻起来像家庭作业,所以我帮了你一个忙,不要为你把它解决成完整的代码。

如果您被允许进入 class,我建议:

  • 扔掉Date class 并使用LocalDate作为生日。 LocalDate来自 java.time,现代 Java 日期和时间 API,在这里代表一个没有时间的日期,这似乎是你需要的。 要初始化 map 值of请使用工厂方法,例如LocalDate.of(1980, Month.JUNE, 1)
  • In Java 8 and later for easy removal of map entries where the value is a date in June, July or August use Map.values() to get a collection view unto the collection of values of the map, then use the removeIf method of the收集视图以删除那些月份内的日期。 这将依次从 map 中删除相应的条目。 它要求您可以编写 lambda 作为参数传递给removeIf

你的代码有什么问题?

  • 除非是家庭作业要求,否则请避免使用Date class。 它总是设计得很糟糕,现在已经过时了。 请改用LocalDate
  • 即使课程要求使用Date ,也不要使用它的getMonth方法。 这种方法已经被弃用了几十年(字面意思),因为它跨时区工作不可靠。 相比之下, LocalDategetMonth方法运行良好且可靠。
  • 正如 Hadi Moloodi 长期以来所说, Date class 非常不自然地从 1 月的 0 到 12 月的 11 对月份进行编号,这就是为什么您的代码没有尝试删除任何条目的原因。 相比之下LocalDate.getMonth()返回一个Month枚举常量,如Month.JUNE ,因此几乎不会混淆含义。
  • 在条目的增强for循环中删除 map 条目将不起作用。 它会抛出java.util.ConcurrentModificationException (大多数时候)(只是因为您的代码没有尝试删除任何条目,所以您没有收到此异常)。 如果您不能使用上面提到的removeIf ,请尝试使用Iterator及其remove方法。

首先,getMonth 是从零开始的。 意思是一月是零,十二月是 11。当你使用 foreach 时,你不能从 map 中删除第二个。 你必须改变你的代码是这样的:

public class BirthdayTest {
    public static void main(String[] args) throws ParseException {
        BirthdayTest b = new BirthdayTest();
        Map map = createMap();
        removeAllSummerPeople(map);
    }

    public static HashMap<String, Date> createMap() throws ParseException {
        DateFormat df = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
        HashMap<String, Date> map = new HashMap<String, Date>();
        map.put("Stallone", df.parse("JUNE 1 1980"));

        //write your code here
        map.put("a", df.parse("JUNE 1 1980"));
        map.put("b", df.parse("JUNE 1 1980"));
        map.put("c", df.parse("JUNE 1 1980"));
        map.put("d", df.parse("JUNE 1 1980"));
        map.put("e", df.parse("JUNE 1 1980"));
        map.put("f", df.parse("JUNE 1 1980"));
        map.put("g", df.parse("JUNE 1 1980"));
        map.put("h", df.parse("JUNE 1 1980"));
        map.put("i", df.parse("JUNE 1 1980"));

        return map;

    }

    public static void removeAllSummerPeople(Map<String, Date> map) {
        Set<String> tobeDeleted = new HashSet<>();
        //write your code here
        for (HashMap.Entry<String, Date> pair : map.entrySet()) {
            int x = pair.getValue().getMonth() + 1;
            if (x >= 6 && x <= 8) {
                tobeDeleted.add(pair.getKey());
            }
        }
        for (String str : tobeDeleted)
            map.remove(str);
    }
}

所有的废话。 您在尝试从您正在迭代的 object map 中删除密钥时犯了一个主要错误。 您必须首先为要删除的 object map 创建一个副本,然后遍历该副本。 对于日期 stuf 将其放入 String 变量中并检查是否包含您要查找的月份并将其删除。 无需在方法签名日期更改任何内容。 不要作弊 做研究 不要复制其他解决方案 与你得到的东西一起工作并让它发生。

暂无
暂无

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

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