循环遍历一周中的循环增量值

时间:2017-06-16 20:16:16

标签: java android

在我的Android应用中,我使用以下MapCalendar课程的日期映射到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

我想我必须使用模运算符,我只是不知道如何。

我真的很感激任何建议,也许我的做法完全错了。

6 个答案:

答案 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
日语:月 火 水 木 金 土 日