在ArrayList中计数时跳过元素

时间:2019-01-25 11:26:12

标签: java android arraylist

我正在尝试从Arraylist<Integer>的范围创建多个int,但是当我尝试跳过某些元素时,一切都搞砸了。我将数字分为5个不同的ArrayList<>,并以并行方式将所有数字都放在一个公用的Arraylist<>中。直到第一次跳过,我才得到像这样的系列:

Rain    Snow    Cloudy    Sunshine
 1        2        3          4
Rain    Snow    Cloudy    Sunshine
 5        6        7          8

并跳过第29天:

Rain    Cloudy   Sunshine    Rain
 30      31        32         34

Rain    Cloudy   Sunshine    Rain
 34       35       36         38   

下面是我的代码:

private List<Day> getCompleteDayList(){
        ArrayList<Integer> sunshineArray = new ArrayList<>();
        ArrayList<Integer> rainArray = new ArrayList<>();
        ArrayList<Integer> cloudyArray = new ArrayList<>();
        ArrayList<Integer> snowArray = new ArrayList<>();
        ArrayList<Integer> fogArray = new ArrayList<>();
        ArrayList<Integer> dayNumbersList = new ArrayList<>();
        mDayList = new ArrayList<>();
        Day currentDay = null;
        int dayNumber = 0;
        int dayImage = 0;
        for (int i=1;i<=4;i++){
            for (int k=i;k<=87;k+=4){
                dayNumber = k;
                    if (i==1){
                        if (k==29){ // trying to skip 29
                            fogArray.add(k);
                            k = 30;// and begin counting from 30
                        }else if (k==58){//trying to skip 58
                            fogArray.add(k);
                            k=59;//and begin counting from 59
                        }else if (k==87){
                            fogArray.add(k);
                        }
                        rainArray.add(k);
                    }else if (i==2){
                        snowArray.add(k);
                    }else if (i==3){
                        cloudysArray.add(k);
                    }else {
                        sunshineArray.add(k);
                    }
                dayNumbersList.add(dayNumber);
            }
        }
        Collections.sort(dayNumbers);
        int currentDayNumber = 0;
        for (int i = 0;i < dayNumbers.size();i++){
            currentDayNumber = dayNumbers.get(i);
            if (rainArray.contains(currentDayNumber)){
                dayImage = R.drawable.rain;
            }else if (snowArray.contains(currentDayNumber)){
                dayImage = R.drawable.snow;
            }else if (cloudyArray.contains(currentDayNumber)){
                dayImage = R.drawable.clouds;
            }else if (sunshineArray.contains(currentDayNumber)){
                dayImage = R.drawable.sunshine;
            }else if (fogArray.contains(currentDayNumber)){
                dayImage = R.drawable.rsz_water;
            }
            currentDay = new Day(currentDayNumber,dayImage);
            mDayList.add(currentDay);
        }
        return mDayList;
    }

我希望系列保持跳过之前的状态,并且每29天为fogDay,所有这些都显示在Recyclerview中。

谢谢!!!

1 个答案:

答案 0 :(得分:2)

该问题是由第一次迭代引起的。您将day(k)增加一,因此实际上您会跳过某些天(例如32和34之间的间隔),而之后又翻了一番(32、34、34)。 (因为您从25到30到34,所以永远不会分配33)。您还必须在其他i个迭代中增加day(k)

k时,您没有增加i!=1的值,因此您有下雨天: 1、5、9、13、17、21、25、30、34。 下雪天: 2、6、10、14、18、22、26、30、34。

并且因为您正在呼叫if (rainArray.contains(currentDayNumber))

else if (snowArray.contains(currentDayNumber))之前,您将设置一个雨天而不是下雪天。

尝试显示列表的输出(例如rainArray和snowArray),然后您会看到问题。 尝试:rainArray.stream().forEach(System.out::println),同样使用snowArray。

如果将else if替换为if,您会发现它们仍然存在。

编辑:这是一个借助模数在一个数组中工作的示例,因为考虑到该错误,您的示例可能会变得过于复杂。它可以帮助您获得新的想法:

private List<Day> getCompleteDayList() {
  // Temporary save days as (in my case) Strings
  final List<String> rawDays = new ArrayList<>();
  // The foggy days
  final List<Integer> fogDays = Arrays.asList(29, 58, 87);

  final int NUMBER_OF_DAYS = 100;
  // When following a certain pattern, create it first
  for (int i = 1; i <= NUMBER_OF_DAYS; ++i) {
     switch (i % 4) {
     case 1:
        rawDays.add("rain");
        break;
     case 2:
        rawDays.add("snow");
        break;
     case 3:
        rawDays.add("cloudy");
        break;
     case 0:
        rawDays.add("sunshine");
        break;
     }
  }

  // Add a fog string in the list. If you want to replace, you may try to rawDays.set(...)
  fogDays.stream().forEach(dayNumber -> rawDays.add(dayNumber - 1, "fog"));

  final List<Day> days = new ArrayList<>();

  // Add the days
  int dayIndex = 1;
  for (final String weather : rawDays) {
     days.add(new Day(dayIndex++, weather));
     if (days.size() >= NUMBER_OF_DAYS) {
        break;
     }
  }
  return days;
}