KingHodor
KingHodor

Reputation: 547

Java HashSet does not work as expected with Arrays.asList

I am trying to initialize a set with a bunch of data. But when I check some items that are already inserted with the contains function, it returns false.

What is wrong with this code?

public class Class {
    public static Set< String > set = new HashSet< >();

    static {
        set.addAll(Arrays.asList("First Holidays", "Big Milestones", "Pregnancy Milestones", "Create Your Own", "Milestones in Color", "Silver Balloons", "Pink Balloons", "Unicorn Balloons", "Ribbon Badges", "Circle Badges", "Animal numbers", "Cute animals", "Cute months ", "Floral numbers", "Starry numbers", "Activities", "Sleep", "Emotions", "Emoticons", "Endearments", "Love in Color", "Everyday in Color", "Badges & Banners", "Pop Art", "Fireworks", "Dividers", "Flags", "Hearts", "Love In Color", "Props", "Masks", "Stats", "This & That", "Gender Reveals", "Birth Announcements", "Measurements", "Announcements in Color", "Funny in Color", "Daddy", "Family", "Friends", "Friends & Family in Color", "Christmas", "Christmas Doodles", "Christmas in Color", "New Year", "New Year in Color", "Easter", "Easter in Color", "Halloween", "Halloween in Color", "Thanksgiving", "Thanksgiving in Color", "Mothers Day", "Mothers Day In Color", "Fathers Day", "Valentine’s Day", "Valentine’s Day in Color", "Happy Hanukkah", "Happy Ramadan", "Holidays in Color", "Birthday in Color", "Unicorn", "Party", "Summer", "Fall", "Winter", "School Bursts", "Gender Reveals", "Baby shower", "Pregnancy Milestones", "Bump Fruit Stickers", "Bump Fruit Badges", "Weekly Stickers", "Weekly Ribbon Badges", "Weekly Calendar Stickers", "Ribbon Due Dates", "Cute Due Dates", "Pregnancy in Color", "Gender Reveals", "Baby shower", "Pregnancy Milestones", "Bump Fruit Stickers", "Bump Fruit Badges", "Weekly Stickers", "Weekly Ribbon Badges", "Weekly Calendar Stickers", "Ribbon Due Dates", "Cute Due Dates", "Pregnancy in Color", "Gender Reveals", "Birth Announcements", "Measurements", "Announcements in Color", "Pink Balloons", "Unicorn Balloons", "Ribbon Badges", "Circle Badges", "Cute animals", "Cute months", "Floral numbers", "Starry numbers", "First Holidays", "Big Milestones", "Pregnancy Milestones", "Create Your Own", "Milestones in Color", "Activities", "Sleep", "Emotions", "Emoticons", "Endearments", "Love in Color", "Everyday in Color", "Badges & Banners", "Pop Art", "Fireworks", "Dividers", "Flags", "Hearts", "Love In Color", "Props", "Masks", "Stats", "This & That", "Daddy", "Family", "Friends", "Friends & Family in Color", "Christmas", "Christmas", "Christmas in Color", "New Year", "New Year in Color", "Easter", "Easter in Color", "Halloween", "Halloween in Color", "Thanksgiving", "Thanksgiving in Color", "Mothers Day", "Mothers Day In Color", "Fathers Day", "Valentine’s Day", "Valentine’s Day in Color", "Happy Hanukkah", "Happy Ramadan", "Holidays in Color", "Summer", "Fall", "Winter", "Funny in Color", "Birthday in Color", "Unicorn", "Party", "School Bursts"));
    }

    public static void main(String[] args) {
        boolean check = set.contains("Animal Numbers");
        System.out.println(check); // false
    }
}

Also tried like this, still does not work.

public class Class {
    public static Set <String> set = new HashSet<>(Arrays.asList("First Holidays", "Big Milestones", "Pregnancy Milestones", "Create Your Own", "Milestones in Color", "Silver Balloons", "Pink Balloons", "Unicorn Balloons", "Ribbon Badges", "Circle Badges", "Animal numbers", "Cute animals", "Cute months ", "Floral numbers", "Starry numbers", "Activities", "Sleep", "Emotions", "Emoticons", "Endearments", "Love in Color", "Everyday in Color", "Badges & Banners", "Pop Art", "Fireworks", "Dividers", "Flags", "Hearts", "Love In Color", "Props", "Masks", "Stats", "This & That", "Gender Reveals", "Birth Announcements", "Measurements", "Announcements in Color", "Funny in Color", "Daddy", "Family", "Friends", "Friends & Family in Color", "Christmas", "Christmas Doodles", "Christmas in Color", "New Year", "New Year in Color", "Easter", "Easter in Color", "Halloween", "Halloween in Color", "Thanksgiving", "Thanksgiving in Color", "Mothers Day", "Mothers Day In Color", "Fathers Day", "Valentine’s Day", "Valentine’s Day in Color", "Happy Hanukkah", "Happy Ramadan", "Holidays in Color", "Birthday in Color", "Unicorn", "Party", "Summer", "Fall", "Winter", "School Bursts", "Gender Reveals", "Baby shower", "Pregnancy Milestones", "Bump Fruit Stickers", "Bump Fruit Badges", "Weekly Stickers", "Weekly Ribbon Badges", "Weekly Calendar Stickers", "Ribbon Due Dates", "Cute Due Dates", "Pregnancy in Color", "Gender Reveals", "Baby shower", "Pregnancy Milestones", "Bump Fruit Stickers", "Bump Fruit Badges", "Weekly Stickers", "Weekly Ribbon Badges", "Weekly Calendar Stickers", "Ribbon Due Dates", "Cute Due Dates", "Pregnancy in Color", "Gender Reveals", "Birth Announcements", "Measurements", "Announcements in Color", "Pink Balloons", "Unicorn Balloons", "Ribbon Badges", "Circle Badges", "Cute animals", "Cute months", "Floral numbers", "Starry numbers", "First Holidays", "Big Milestones", "Pregnancy Milestones", "Create Your Own", "Milestones in Color", "Activities", "Sleep", "Emotions", "Emoticons", "Endearments", "Love in Color", "Everyday in Color", "Badges & Banners", "Pop Art", "Fireworks", "Dividers", "Flags", "Hearts", "Love In Color", "Props", "Masks", "Stats", "This & That", "Daddy", "Family", "Friends", "Friends & Family in Color", "Christmas", "Christmas", "Christmas in Color", "New Year", "New Year in Color", "Easter", "Easter in Color", "Halloween", "Halloween in Color", "Thanksgiving", "Thanksgiving in Color", "Mothers Day", "Mothers Day In Color", "Fathers Day", "Valentine’s Day", "Valentine’s Day in Color", "Happy Hanukkah", "Happy Ramadan", "Holidays in Color", "Summer", "Fall", "Winter", "Funny in Color", "Birthday in Color", "Unicorn", "Party", "School Bursts"));

    public static void main(String[] args) {
        boolean check = set.contains("Animal Numbers");
        System.out.println(check); // false
    }
}

Upvotes: 0

Views: 441

Answers (3)

Tom Hawtin - tackline
Tom Hawtin - tackline

Reputation: 147124

With the updated code, the string changes case.

"Circle Badges", "Animal numbers", "Cute animals"

boolean check = set.contains("Animal Numbers");

String.equals is case sensitive.

Upvotes: 2

Thiyanesh
Thiyanesh

Reputation: 2360

Case sensitive - Set lookup is a case sensitive comparison for String objects

Animal Numbers is not in the set. Animal numbers is in the set.

import java.util.*;

class Solution {
    public final Set<String> set;

    public Solution() {
        set = new HashSet<>();
        set.addAll(Arrays.asList("Circle Badges", "Animal numbers", "Cute animals"));
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println("Animal Numbers: " + solution.set.contains("Animal Numbers"));
        System.out.println("Animal numbers: " + solution.set.contains("Animal numbers"));
    }
}

Always lower case (not sure about Locale across different languages)

If case insensitive comparison is needed, one option is to store the string in lowercase and check string in lowercase.

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public final Set<String> set;

    public Solution() {
        set = Arrays.asList("Animal numbers", "Cute animals", "Cute months ")
            .stream().map(String::toLowerCase).collect(Collectors.toSet());
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println("Animal Numbers: " + solution.set.contains("Animal Numbers".toLowerCase()));
        System.out.println("Animal numbers: " + solution.set.contains("Animal numbers".toLowerCase()));
    }
}

Note

The example input in question contains space( ) after Cute months , so trim() might be needed both in input and during the check

Upvotes: 3

Ferry
Ferry

Reputation: 404

you initialize with name "set" but doing addAll for "proSet"? I don't see anything wrong beside it. but, for better reading options, it could be:

public static Set <String> set = new HashSet<>(Arrays.asList(... ,"Animal Numbers", ...));

Upvotes: 0

Related Questions