Java Java Data Structures Exploring the Java Collection Framework Maps

Dozie Anazia
Dozie Anazia
1,227 Points

getCategoryCounts Everything is correct except for the return statement.

I've done everything I could, but I'm not sure where I went wrong. Apparently I'm missing the return statement according to the compiler error, but I'm not sure where to put it.

Please help

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 Set<String> getAllAuthors() {
    Set<String> authors = new TreeSet<>();
    for (BlogPost post: mPosts) {
      authors.add(post.getAuthor());
    }
    return authors;
  }
  public Map<String, Integer> getCategoryCounts() {
    Map<String, Integer> categoryCounts = new HashMap<String, Integer>();
    for(BlogPost post: mPosts) {
    for(String type: post.getWords()) {
      Integer count = categoryCounts.get(type);
      if (count == null) {
        count = 0;
      }
      count++;
      categoryCounts.put(type, count);
    }
   }
  }

}
Dozie Anazia
Dozie Anazia
1,227 Points

So I added the return statement which was in the middle of the last 4 brackets. My return statement was // return categoryCounts; // Apparently this still isn't correct. My error reads: "Bummer: For category Entertainment, expected 1 but received null."

I'm even more confused now. this is the only error I have.

1 Answer

Linda de Haan
Linda de Haan
12,085 Points

This code worked for me:

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

Get rid of the inner for loop. The return statement usually goes at the end of the method, but not always. If a method returns a Map, the method body has to return that somewhere in its code. If you're not sure where to put a return statement, go through the method a few times using different scenario's.