2017-06-16 204 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
日本:月 火 水 木 金 土 日