Java中通过for循环调用多类对象方法的实现及日历场景优化建议
解决日历界面日期定位的代码问题与优化方案
先来说说你这段代码里的几个明显问题,以及怎么快速修复让它跑起来,再结合你的日历场景给点更实用的优化建议。
一、修复现有代码的核心技巧
你的代码现在跑不起来主要有几个小问题,逐个解决就行:
- HashMap遍历方式错误
HashMap本身不是可直接遍历值的集合,你直接for(Object object : hashMap)遍历的是它的键集合,不是存储的对象。要遍历存储的对象,得用hashMap.values():
for(Object object : hashMap.values()) { // ... }
方法名大小写不匹配
你在ExampleCLass里定义的是printName()(大写N),但调用的时候写的是printname()(小写n),Java是大小写敏感的,必须统一成printName()。HashMap未存入任何对象
你创建了HashMap但没有put任何ExampleCLass实例进去,遍历自然不会有输出,记得添加:
hashMap.put(1, object1); hashMap.put(2, object2);
- 泛型类型优化
把HashMap<Integer, Object>改成HashMap<Integer, ExampleCLass>,这样遍历的时候不用强制类型转换,代码更安全也更简洁:
HashMap<Integer, ExampleCLass> hashMap = new HashMap<>(); // 存入对象后遍历 for(ExampleCLass obj : hashMap.values()) { obj.printName(); }
修复后的完整代码大概是这样:
public class Test { public static void main(String[] args) { ExampleCLass object1 = new ExampleCLass("object1"); ExampleCLass object2 = new ExampleCLass("object2"); HashMap<Integer, ExampleCLass> hashMap = new HashMap<>(); // 存入对象 hashMap.put(1, object1); hashMap.put(2, object2); // 遍历值集合 for(ExampleCLass obj : hashMap.values()) { obj.printName(); } } } class ExampleCLass { private final String name; public ExampleCLass(String name) { this.name = name; } public void printName(){ System.out.println(this.name); } }
二、结合日历场景的更优实现方案
虽然HashMap能解决问题,但结合你做日历界面的场景,其实用数组或者ArrayList来存储日期Text组件会更合适,原因有两个:
- 日历的日期格子是固定顺序的(比如每周7天,一共6行42个格子,索引从0到41),用连续索引的集合(数组/ArrayList)比HashMap的键值对访问效率更高,随机访问更快。
- 日历的日期排布是按顺序填充的,从当月第一天的位置开始,依次往后填充1-31号,空的格子(上月剩余或下月前置)可以统一处理,用顺序集合更符合这个逻辑。
举个简化的思路示例:
import java.util.ArrayList; import java.util.Calendar; public class CalendarView { // 存储所有日历格子的Text组件,共42个(7天*6行) private ArrayList<Text> dateTexts = new ArrayList<>(); public CalendarView() { // 初始化:创建42个Text对象并加入集合 for (int i = 0; i < 42; i++) { dateTexts.add(new Text()); } } public void updateCalendar(int year, int month) { // 清空所有格子的文本 for (Text text : dateTexts) { text.setText(""); } // 获取当月第一天是星期几(Calendar.SUNDAY是1,MONDAY是2... 可根据你的日历起始调整) Calendar cal = Calendar.getInstance(); cal.set(year, month - 1, 1); int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 假设日历从周日开始,那么第一天的索引是firstDayOfWeek - 1 int startIndex = firstDayOfWeek - 1; // 获取当月的天数 int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 填充当月日期 for (int day = 1; day <= daysInMonth; day++) { if (startIndex + day - 1 < dateTexts.size()) { dateTexts.get(startIndex + day - 1).setText(String.valueOf(day)); } } } // 模拟UI的Text组件 static class Text { private String text; public void setText(String text) { this.text = text; System.out.println("设置文本:" + text); } } public static void main(String[] args) { CalendarView view = new CalendarView(); // 更新2024年5月的日历 view.updateCalendar(2024, 5); } }
这个方案的优势:
- 逻辑更贴合日历的排布规则,代码可读性更高
- 数组/ArrayList的随机访问时间复杂度是O(1),比HashMap略高效(HashMap是O(1)但有哈希计算开销)
- 统一管理所有日期格子,处理空格子、前后月日期也更方便
内容的提问来源于stack exchange,提问作者Pyson
相关产品推荐
相关产品推荐

