简体   繁体   中英

Check if HashMap values are equal

I need to write a loop that will see if the values in a HashMap are equal and if they are see how many times they occur. Sets of numbers will be entered in through the Scanner (example input will be below) The following code will put the key of count and the value of the HashSet into the hashMap.

public static void main(String[] args) {
    System.out.println("Type in your numbers followed by spaces and press enter");
    System.out.println("After every set entered type in any letter to enter more sets");
    System.out.println("Or enter * to finish");

    HashMap<Integer, HashSet<Integer>> hset = new HashMap<>();
    Scanner sc = new Scanner(System.in);
    int count = 1;

    HashSet<Integer> list = new HashSet<>();
    while(sc.hasNextLine()) {
        while(sc.hasNextInt()) {
            list.add(sc.nextInt());
        }
        hset.put(count, new HashSet<>(list));
        count++;
        list.clear();
        sc.nextLine();
        if(sc.nextLine().equals("*")) {
            System.out.println("working");
            break;
        }
    }
    for(int i=0; i<count; i++){
        //some code goes here
        //if(hset.get(x) == hset.get(j)) or something along these lines
    }
}

//Sample Scanner input
1 2 3 4 5
10 9 8 7
5 4 3 2 1
1 1 1 1 1
1 2 3 5
1 2 3 6
6 4 2
2 4 6
4 2 6
4 6 2
6 2 4
1 3 2 4 5
15 14 13
5 3 2 1
79
7 9

//What I need the output to look like    
[7, 9]=1
[1]=1
[7, 8, 9, 10]=1
[13, 14, 15]=1
[1, 2, 3, 5]=2
[1, 2, 3, 6]=1
[2, 4, 6]=5
[1, 2, 3, 4, 5]=3
[79]=1

Given the above input in a List of List form, you can do it as follows:

List<List<Integer>> list = List.of(List.of(1, 2, 3, 4, 5),
        List.of(10, 9, 8, 7), List.of(5, 4, 3, 2, 1),
        List.of(1, 1, 1, 1, 1), List.of(1, 2, 3, 5),
        List.of(1, 2, 3, 6), List.of(6, 4, 2),
        List.of(2, 4, 6), List.of(4, 2, 6), List.of(4, 6, 2),
        List.of(6, 2, 4), List.of(1, 3, 2, 4, 5),
        List.of(15, 14, 13), List.of(5, 3, 2, 1), List.of(79),
        List.of(7, 9));
  • since the count will be changing I recommend using the set as the key and the count as the value. You can always reverse them later. Also note that sets with the same values compare equally without regard to order.
  • just stream the lists and convert to a set. The dups will be removed automatically.
  • put them in a Map<Set<Integer>, Long>
  • input may still be taken from the console.
Map<Set<Integer>, Long> map = list.stream().map(lst->new HashSet<>(lst))
        .collect(Collectors.groupingBy(a->a,
            Collectors.counting()));

Prints

[7, 9]=1
[1]=1
[7, 8, 9, 10]=1
[13, 14, 15]=1
[1, 2, 3, 5]=2
[2, 4, 6]=5
[1, 2, 3, 6]=1
[79]=1
[1, 2, 3, 4, 5]=3
 

I would do it like this:

System.out.println("Type in your numbers followed by spaces and press enter");
System.out.println("After every set entered type in any letter to enter more sets");
System.out.println("Or enter * to finish");
Scanner sc = new Scanner(System.in);

Map<Set<Integer>, Integer> setCounts = new HashMap<>();
do {
    if (sc.hasNextInt()) {
        Set<Integer> set = new TreeSet<>();
        do {
            set.add(sc.nextInt());
        } while (sc.hasNextInt());
        setCounts.compute(set, (key, count) -> count != null ? count + 1 : 1);
    }
} while (sc.hasNext() && ! sc.next().equals("*"));
setCounts.entrySet().forEach(System.out::println);

Numbers from question, changed to fit printed instructions

1 2 3 4 5 x
10 9 8 7 x
5 4 3 2 1 x
1 1 1 1 1 x
1 2 3 5 x
1 2 3 6 x
6 4 2 x
2 4 6 x
4 2 6 x
4 6 2 x
6 2 4 x
1 3 2 4 5 x
15 14 13 x
5 3 2 1 x
79 x
7 9 x
*

Output

[7, 9]=1
[1]=1
[7, 8, 9, 10]=1
[13, 14, 15]=1
[1, 2, 3, 5]=2
[2, 4, 6]=5
[1, 2, 3, 6]=1
[79]=1
[1, 2, 3, 4, 5]=3

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM