在我的Android应用中,我使用以下Map
将Calendar
课程的日期映射到String
:
Map<Integer, String> map = new HashMap<>(7);
// values of the Calendar field
map.put(Calendar.MONDAY, "Mon"); // 2
map.put(Calendar.TUESDAY, "Tue"); // 3
map.put(Calendar.WEDNESDAY, "Wed"); // 4
map.put(Calendar.THURSDAY, "Thu"); // 5
map.put(Calendar.FRIDAY, "Fri"); // 6
map.put(Calendar.SATURDAY, "Sat"); // 7
map.put(Calendar.SUNDAY, "Sun"); // 1
并将Button
动态添加到LinearLayout
,其日文字如下:
LinearLayout dayLayout = (LinearLayout) findViewById(R.id.layout_days);
for(int i = 1; i <= 7; i++) {
Button button = new Button(this);
button.setText(map.get(i));
dayLayout.addView(button);
}
这样可行,但Button
的列表始终从星期日开始,无论当前Locale
如何。
我试图重写此循环,因此需要考虑一周的第一天。
这样的事情:
LinearLayout dayLayout = (LinearLayout) findViewById(R.id.layout_days);
int firstDayOfWeek = Calendar.getInstance().getFirstDayOfWeek();
for(int i = firstDayOfWeek; i <= 7; ???) { // this is where i'm stuck
Button button = new Button(this);
button.setText(map.get(i));
dayLayout.addView(button);
}
问题是我无法找出以正确顺序获取日期的正确公式。
如果一周的第一天是星期一,则循环必须为2 3 4 5 6 7 1
。
我想我必须使用模运算符,我只是不知道如何。
我真的很感激任何建议,也许我的做法完全错了。
答案 0 :(得分:2)
首先,您不应使用Calendar.*
常量的数值。
数值是实现细节,而不是API,不应像for循环尝试那样直接使用。
最好将常量存储在列表中:
List<Integer> days = Arrays.asList(
Calendar.MONDAY,
Calendar.TUESDAY,
Calendar.WEDNESDAY,
Calendar.TUESDAY,
Calendar.FRIDAY,
Calendar.SATURDAY,
Calendar.SUNDAY
);
然后找到其值对应于firstDayOfWeek
的索引:
int start = days.indexOf(firstDayOfWeek);
然后,通过将start
和模运算符的值旋转0..6索引来创建正确的映射键,如下所示:
for(int i = 0; i < 7; i++) {
int key = days.get((start + i) % 7);
Button button = new Button(this);
button.setText(map.get(key));
dayLayout.addView(button);
}
答案 1 :(得分:0)
从i
开始为1 2 3 4 5 6 7
,
你可以拿这些mod 7,给1 2 3 4 5 6 0
然后添加1:给2 3 4 5 6 7 1
。
答案 2 :(得分:0)
可能会在for循环中添加一个计数,并将count与7进行比较,这样无论开始如何,循环都将持续7天。
所以也许这样的事情
LinearLayout dayLayout = (LinearLayout) findViewById(R.id.layout_days);
int firstDayOfWeek = Calendar.getInstance().getFirstDayOfWeek();
int count = 1;
for(int i = firstDayOfWeek; count <= 7; i++) {
count++
if(i <= 7)
firstDayOfWeek = 1;
Button button = new Button(this);
button.setText(map.get(i));
dayLayout.addView(button);
}
答案 3 :(得分:0)
定义一个这样的数组:
int[] daysInWeek = [2, 3, 4, 5, 6, 7, 1]
然后解决方案应该是:
// define day of week you want to print out first.
int firstDayOfWeekIndex = 0; // print Monday first
for (int i = 0; i < 7; i++) {
int currentDay = (firstDayOfWeekIndex + i) % 7;
String day = map.get(daysInWeek[currentDay]);
// print this day to your button
Button button = new Button(this);
button.setText(day);
dayLayout.addView(button);
}
答案 4 :(得分:0)
这不是你想要的吗?
Map<String, Integer> names = (new GregorianCalendar()).getDisplayNames(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.ENGLISH);
给出了
Tue, 3
Thu, 5
Sun, 1
Sat, 7
Wed, 4
Mon, 2
Fri, 6
答案 5 :(得分:0)
这是一个完整的示例,它也消除了对Map的需要,以便工作日以正确的语言环境显示。
DateFormatSymbols symbols = new DateFormatSymbols(Locale.getDefault());
// Array with 8 elements (first is empty string), so Calendar constants correspond to the day.
String[] dayNames = symbols.getShortWeekdays();
int firstDayOfWeek = Calendar.getInstance().getFirstDayOfWeek();
int daysStart = Calendar.SUNDAY;
int daysEnd = Calendar.SATURDAY;
int dayCount = (daysEnd - daysStart) + 1; // +1 because both ends inclusive
for(int i = 0; i < dayCount; i++) {
int day = firstDayOfWeek + i;
if(day > daysEnd) // loop back if over the end
day -= dayCount;
Button button = new Button(this);
button.setText(dayNames[day]);
dayLayout.addView(button);
}
第一天从DayDayOek开始:2 3 4 5 6 7 1
英语:Mon Tue Wed Thu Fri Sat Sun
日语:月 火 水 木 金 土 日