sara
sara

Reputation: 11

Using a Hashmap to detect duplicates and count of duplicates in a list

I'm trying to use hashmaps to detect any duplicates in a given list, and if there is, I want to add "1" to that String to indicate its duplication. If it occurs 3 times, the third one would add "3" after that string.

I can't seem to figure that out, keeping track of the number of duplicates. It only adds 1 to the duplicates, no matter if it's the 2nd or 3rd or 4th,..etc duplicate.

This is what I have:

public static List<String> duplicates(List<String> given) {
     List<String> result = new ArrayList<String>();
     HashMap<String, Integer> hashmap = new HashMap<String, Integer>();

     for (int i=0; i<given.size(); i++) {
       String current = given.get(i);
       if (hashmap.containsKey(current)) {
           result.add(current+"1");
       } else {
           hashmap.put(current,i);
           result.add(current);
       }
     }

     return result;
 }

I want to include the values that only occur once as well, as is (no concatenation).

Sample Input: ["mixer", "toaster", "mixer", "mixer", "bowl"]

Sample Output: ["mixer", "toaster", "mixer1", "mixer2", "bowl"]

Upvotes: 1

Views: 2088

Answers (4)

josejuan
josejuan

Reputation: 9566

public static List<String> duplicates(List<String> given) {
    final Map<String, Integer> count = new HashMap<>();
    return given.stream().map(s -> {
        int n = count.merge(s, 1, Integer::sum) - 1;
        return s + (n < 1 ? "" : n);
    }).collect(toList());
}

Upvotes: 3

theunknownSAI
theunknownSAI

Reputation: 330

ArrayList finallist = new ArrayList<String>();
    
    for (int i=0; i<given.size(); i++) {
       String current = given.get(i);
       if (hashmap.containsKey(current)) {
            hashmap.put(current,hashmap.get(current)+1);
       } else {
           hashmap.put(current,1); 
                 
       }
       String num = hashmap.get(current) == 1 ? "" :Integer.toString(hashmap.get(current));
       finallist.add(current+num);
     }
     
     System.out.println(finallist);

Upvotes: 0

Mureinik
Mureinik

Reputation: 311188

You always add the hard-coded string "1" instead of using the count saved in the map:

public static List<String> duplicates(List<String> given) {
    List<String> result = new ArrayList<>(given.size());
    Map<String, Integer> hashmap = new HashMap<>();

    for (String current : given) {
        if (hashmap.containsKey(current)) {
            int count = hashmap.get(current) + 1;
            result.add(current + count);
            hashmap.put(current, count);
        } else {
            hashmap.put(current, 0);
            result.add(current);
        }
    }

    return result;
}

Upvotes: 0

Krisko
Krisko

Reputation: 165

I renamed final to output as the first one is a keyword that cannot be used as a variable name.

if (hashmap.containsKey(current)) {
    output.add(current + hashmap.get(current)); // append the counter to the string
    hashmap.put(current, hashmap.get(current)+1); // increment the counter for this item
} else {
    hashmap.put(current,1); // set a counter of 1 for this item in the hashmap
    output.add(current);
}

Upvotes: 0

Related Questions