Blaze Mathew
Blaze Mathew

Reputation: 185

Add item to arraylist at specific interval

I am trying to add an element to ArrayList after every 4 items.

ArrayList after this should be like,

item|item|item|item|new_item|item|item|item|item|new_item|item...

So I use the code

int x=0;
for (int i=1;i<myNews.size();i++) {           
    if (i%4==0) {
        NewsData news = new NewsData();
        news.setId(999);
        news.setItem_type(3);
        news.setCat_id(97);
        myNews.add(i+x,news);
        x++;
    }
}

This doesn't seem to work as required. How would I achieve this?

Upvotes: 0

Views: 820

Answers (2)

Tanmay Baid
Tanmay Baid

Reputation: 469

To make it more readable, you can also try using a new ArrayList. Loop through an existing array list and add elements to new ArrayList with an condition of every 4th element is new.

    List<NewsData> myNews = new ArrayList<>();
    List<NewsData> newNews = new ArrayList<>();

    for (int i = 0; i < myNews.size(); i++) {
        if (i % 4 == 0) {
            NewsData news = new NewsData();
            news.setId(999);
            news.setItem_type(3);
            news.setCat_id(97);
            myNews.add(news);
        }
        newNews.add(myNews.get(i));
    }

Upvotes: 3

wvdz
wvdz

Reputation: 16651

The problem is that your index gets messed up by inserting elements. The best way to solve this common problem is to traverse the list the other way around, i.e., start with the last item.

for (int i=myNews.size()-1;i>0;i--) {           
  if (i%4==0) {
    NewsData news = new NewsData();
    news.setId(999);
    news.setItem_type(3);
    news.setCat_id(97);
    myNews.add(i,news);
  }
}

If you want to avoid looping over all the items and to only iterate where you want to insert items, you have to figure out the last item where you want to insert:

int last = myNews.size() / 4 * 4;
if (last == myNews.size())
    last -= 4;
for (int i = last; i > 0;i -= 4) {           
    NewsData news = new NewsData();
    news.setId(999);
    news.setItem_type(3);
    news.setCat_id(97);
    myNews.add(i, news);
}

Upvotes: 1

Related Questions