Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Java Java Data Structures - Retired Exploring the Java Collection Framework Maps

Rob Bridges
seal-mask
.a{fill-rule:evenodd;}techdegree seal-36
Rob Bridges
Full Stack JavaScript Techdegree Graduate 35,467 Points

Need help on this one as well.

I was able to more or less get it working, first I had the second for statement loop through post.gotCategory() but that wasn't an array or object that they can loop over so I had to modify our getAuthor code to get categories, and tries to pass it loop over that, the code works, but it is not giving me too high of a count.

The error message it is giving me is "for category entertainment expected 1 but got 10" So I know that I'm having it loop wrong in the second code.

Can I get some help with this one as well?

Thanks.

com/example/BlogPost.java
package com.example;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class BlogPost implements Comparable<BlogPost>, Serializable {
  private String mAuthor;
  private String mTitle;
  private String mBody;
  private String mCategory;
  private Date mCreationDate;

  public BlogPost(String author, String title, String body, String category, Date creationDate) {
    mAuthor = author;
    mTitle = title;
    mBody = body;
    mCategory = category;
    mCreationDate = creationDate;
  }

  public int compareTo(BlogPost other) {
    if (equals(other)) {
      return 0;
    }
    return mCreationDate.compareTo(other.mCreationDate);
  }

  public String[] getWords() {
    return mBody.split("\\s+");
  }

  public List<String> getExternalLinks() {
    List<String> links = new ArrayList<String>();
    for (String word : getWords()) {
      if (word.startsWith("http")) {
        links.add(word);
      }
    }
    return links;
  }

  public String getAuthor() {
    return mAuthor;
  }

  public String getTitle() {
    return mTitle;
  }

  public String getBody() {
    return mBody;
  }

  public String getCategory() {
    return mCategory;
  }

  public Date getCreationDate() {
    return mCreationDate;
  }
}
com/example/Blog.java
package com.example;

import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.Map;
import java.util.HashMap;


public class Blog {
  List<BlogPost> mPosts;

  public Blog(List<BlogPost> posts) {
    mPosts = posts;
  }

  public List<BlogPost> getPosts() {
    return mPosts;
  }
  public Map<String, Integer> getCategoryCounts() {
    Map<String, Integer> categoryCount = new HashMap<String, Integer>();
    for (BlogPost post : mPosts) {
      for (String category : getAllCategories()) {
        Integer count = categoryCount.get(category);
        if (count == null) {
        count = 0;
       }
      count++;
      categoryCount.put(category, count);
    }
  }
  return categoryCount;
}
  public Set<String> getAllCategories() {
    Set<String> category = new TreeSet<>();
    for (BlogPost post: mPosts) {
      category.add(post.getCategory());
    }
    return category;
  }

}

3 Answers

Craig Dennis
STAFF
Craig Dennis
Treehouse Teacher

Hi Rob!

You don't need to modify the other code, cool though;)

Just use a single for loop to go over the posts and use the result of post.getCategory for the key.

You're super close!

Rob Bridges
seal-mask
.a{fill-rule:evenodd;}techdegree seal-36
Rob Bridges
Full Stack JavaScript Techdegree Graduate 35,467 Points

Hey Craig,

Thanks for the encouragement, I think I made it farther at least,

I changed my code to.

public Map<String, Integer> getCategoryCounts() {
    Map<String, Integer> categoryCount = new HashMap<String, Integer>();
    for (BlogPost post : mPosts) {
      Integer count = categoryCount.get(post);
      if (count == null) {
        count = 0;
       }
       count++;
       categoryCount.put(post.getCategory(), count);
    }
    return categoryCount;
  }

And I don't think it's properly incrementing anymore. Food returned 1 when it should have returned 2.

Any further tips on this?

Great course on the way so far! I enjoy the challenge, even if I feel like I'll never get it at times.

Craig Dennis
STAFF
Craig Dennis
Treehouse Teacher

Make sure you get and put the same key in....

Rob Bridges
seal-mask
.a{fill-rule:evenodd;}techdegree seal-36
Rob Bridges
Full Stack JavaScript Techdegree Graduate 35,467 Points

Thank you!

I'm going to go to sleep as the kneejerk reaction is to delete this entire question out of embarassment, and pretend like I of course noticed that in the first place.

Thanks again!

To Rob and Craig, This forum thread was helpful.

At least until this hint..

Make sure you get and put the same key in....

That was a big "huh?" for me.

It was only after an hour of playing around that I stumbled on:

Integer count = categoryCount.get(post.getCategory());

So thanks for the help..

I'm glad this thread was not deleted,

otherwise I would have been trying a lot of other non-function variations

before I got to the right code with the help of these posts. :thumbs up: