2017-06-16 173 views
3

的日子进行遍历时,在我的Android应用我使用以下MapCalendar类的天映射到String S:For循环增值通过

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 s到一个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是清单总是从星期日开始的当前不管。

我想重写这个循环,所以它需要考虑一周的第一天。

事情是这样的:

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

为了澄清,你要能够有任何一天是星期的第一天,还是你只是想让它从星期一开始? – MartinByers

回答

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); 
} 
0

i1 2 3 4 5 6 7
你可以利用这些MOD 7起,给予1 2 3 4 5 6 0
,然后加入1:给予2 3 4 5 6 7 1

0

可能会在for循环中添加一个计数并将计数与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); 
} 
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); 
} 
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 
0

下面是一个完整的例子,也消除了对地图的需求,使平日里都显示在正确的语言环境。

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); 
} 

日开始于Firstdayofweek可:2 3 4 5 6 7 1
英语:Mon Tue Wed Thu Fri Sat Sun
日本:月 火 水 木 金 土 日