Piotr Szczepanik
Piotr Szczepanik

Reputation: 381

How to count duplicate elements in ArrayList?

I need to separate and count how many values in arraylist are the same and print them according to the number of occurrences.

I've got an arraylist called digits :

 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

I created a method which separates each value and saves it to a new array.

public static ArrayList<Integer> myNumbers(int z) {

    ArrayList<Integer> digits = new ArrayList<Integer>();
    String number = String.valueOf(z);
    for (int a = 0; a < number.length(); a++) {
        int j = Character.digit(number.charAt(a), 10);
        digits.add(j);
    }
    return digits;

}

After this I've got a new array called numbers. I'm using sort on this array

Collections.sort(numbers);

and my ArrayList looks like this:

[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9]

It has:

2 times 0; 
9 times 1;
4 times 2;
6 times 3;
5 times 4;
6 times 5;
5 times 6;
5 times 7;
5 times 8;
3 times 9;

I need to print out the string of numbers depend on how many are they So it suppose to look like this : 1354678290

Upvotes: 17

Views: 113747

Answers (13)

Praveenkumar_V
Praveenkumar_V

Reputation: 1394

public void printCountNumber(List<Integer> numberList) {
    for(int number:numberList.stream().distinct().collect(Collectors.toList())) {
        System.out.println(number +" Times "+Collections.frequency(numberList, number));            
    }
}

Java 8 – How to find duplicate in a Stream or List

Upvotes: 0

noob
noob

Reputation: 399

general algorithm

define a empty set of type element, counter int variable pair=0.

  1. start iterating using for loop
  2. check if element present in set
    • if not present add element to set and move to next iteration
    • if present remove element from sent, increment pair counter by 1`

// public static int findDuplicate(int n, List ar) {

int pairs=0;
  Set<Integer> color=new HashSet<Integer>();
  for(int i=0;i<ar.size();i++)
  {
      if(color.contains(ar.get(i)))
      {
      pairs++;
      color.remove(ar.get(i));
      }
      else{
          color.add(ar.get(i));  
      }
  }
  return pairs;
}

} //

Upvotes: 0

Sankarasai
Sankarasai

Reputation: 73

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class A_List_Find_Duplicate_Count {

    public static void main(String[] args) {
        
        List<String> list = Arrays.asList(
                "Chennai","Bangalore","Pune","Hyderabad",
                "Chennai","Pune","Mysore","Delhi","Hyderabad",
                "Pune"
                );
        String elementToFound = "Chennai";
        
        //JAVA 8 
        long count = list.stream().filter(i->elementToFound.equals(i)).count();
        System.out.println("elementToFound : "+count);
        
        
        //using Collections
        int frequency = Collections.frequency(list, elementToFound);
        System.out.println("frequency : "+frequency);
        
        
        //using Map
        HashMap<String, Integer> map = new HashMap<>();
        for(String s : list)
        {
            map.put(s, map.get(s)!=null ? map.get(s)+1 : 1);
        }
        
        System.out.println("map : "+map.get(elementToFound));
        
        //JAVA 8 using groupingBy
        Map<String, Long> collect = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        System.out.println("collect groupingBy : "+collect.get(elementToFound));
        

    }

}

Output

elementToFound : 2 frequency : 2 map : 2 collect groupingBy : 2

Upvotes: 1

PrabaharanKathiresan
PrabaharanKathiresan

Reputation: 1129

use Collections.frequency method to count the duplicates

Upvotes: 12

naresh goyal
naresh goyal

Reputation: 91

Map#merge method can also be used:

 List<Integer> input = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,
            4181, 6765);
 final Map<Integer, Integer> result = new HashMap<>();
 input.forEach(in -> result.merge(in, 1, Integer::sum));

Upvotes: 1

Bhushan Uniyal
Bhushan Uniyal

Reputation: 5703

Java 8 can handle this problem with 3 lines of code.

    Map<Integer, Integer>  duplicatedCount = new LinkedHashMap<>();
    list.forEach(a -> duplicatedCount.put(a, duplicatedCount.getOrDefault(a, 0) +1));
    duplicatedCount.forEach((k,v) -> System.out.println(v+" times "+k));

Upvotes: 0

pruthwiraj.kadam
pruthwiraj.kadam

Reputation: 1093

List<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("a");
    list.add("a");
    list.add("a");

int countA=Collections.frequency(list, "a");
int countB=Collections.frequency(list, "b");
int countC=Collections.frequency(list, "c");

Upvotes: 23

Ramij
Ramij

Reputation: 31

Use below function for count duplicate elements :

public void countDuplicate(){
        try {
            Set<String> set = new HashSet<>(original_array);
            ArrayList<String> temp_array = new ArrayList<>();
            temp_array.addAll(set);
            for (int i = 0 ; i < temp_array.size() ; i++){
                Log.e(temp_array.get(i),"=>"+Collections.frequency(original_array,temp_array.get(i)));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

Upvotes: 0

Madina Mountaniol
Madina Mountaniol

Reputation: 1

Java 8, the solution: 1. Create Map when the Key is the Value of Array and Value is counter. 
2. Check if Map contains the Key increase counter or add a new set.

 private static void calculateDublicateValues(int[] array) {
      //key is value of array, value is counter
      Map<Integer, Integer> map = new HashMap<Integer, Integer>();

      for (Integer element : array) {
        if (map.containsKey(element)) {
          map.put(element, map.get(element) + 1); // increase counter if contains
        } else
          map.put(element, 1);
      }

      map.forEach((k, v) -> {
        if (v > 1)
          System.out.println("The element " + k + " duplicated " + v + " times");
      });

    }

Upvotes: 0

Soudipta Dutta
Soudipta Dutta

Reputation: 2122

The question is to count how many ones twos and threes are there in an array. In Java 7 solution is:

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class howMany1 {
public static void main(String[] args) {

    List<Integer> list = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765);

    Map<Integer ,Integer> map = new HashMap<>();

      for(  Integer r  : list) {
          if(  map.containsKey(r)   ) {
                 map.put(r, map.get(r) + 1);
          }//if
          else {
              map.put(r, 1);
          }
      }//for

      //iterate

      Set< Map.Entry<Integer ,Integer> > entrySet = map.entrySet();
      for(    Map.Entry<Integer ,Integer>  entry : entrySet     ) {
          System.out.printf(   "%s : %d %n "    , entry.getKey(),entry.getValue()  );
      }//for

}}

In Java 8, the solution to the problem is :

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class howMany2 {
public static void main(String[] args) {

    List<Integer> list = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765);
     // we can also use Function.identity() instead of c->c
    Map<Integer ,Long > map = list.stream()
            .collect(  Collectors.groupingBy(c ->c , Collectors.counting())         ) ;


    map.forEach(   (k , v ) -> System.out.println( k + " : "+ v )                    );

}}

One another method is to use Collections.frequency. The solution is:

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Duplicates1 {
public static void main(String[] args) {

    List<Integer> list = Arrays.asList(1, 1, 2, 3, 5, 8, 13,13, 21, 34, 55, 89, 144, 233);

    System.out.println("Count all with frequency");
    Set<Integer> set = new HashSet<Integer>(list);
    for (Integer r : set) {
        System.out.println(r + ": " + Collections.frequency(list, r));
    }

}}

Another method is to change the int array to Integer List using method => Arrays.stream(array).boxed().collect(Collectors.toList()) and then get the integer using for loop.

public class t7 {
    public static void main(String[] args) {
        int[] a = { 1, 1, 2, 3, 5, 8, 13, 13 };
        List<Integer> list = Arrays.stream(a).boxed().collect(Collectors.toList());

        for (Integer ch : list) {
            System.out.println(ch + " :  " + Collections.frequency(list, ch));
        }

    }// main
}

Upvotes: 10

Srivastava
Srivastava

Reputation: 3578

You can count the number of duplicate elements in a list by adding all the elements of the list and storing it in a hashset, once that is done, all you need to know is get the difference in the size of the hashset and the list.

ArrayList<String> al = new ArrayList<String>();
al.add("Santosh");
al.add("Saket");
al.add("Saket");
al.add("Shyam");
al.add("Santosh");
al.add("Shyam");
al.add("Santosh");
al.add("Santosh");
HashSet<String> hs = new HashSet<String>();
hs.addAll(al);
int totalDuplicates =al.size() - hs.size();
System.out.println(totalDuplicates);

Let me know if this needs more clarification

Upvotes: 3

Florian Salihovic
Florian Salihovic

Reputation: 3951

By using the Stream API for example.

package tests;

import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Duplicates {

    @Test
    public void duplicates() throws Exception {
        List<Integer> items = Arrays.asList(1, 1, 2, 2, 2, 2);

        Map<Integer, Long> result = items.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        Assert.assertEquals(Long.valueOf(2), result.get(1));
        Assert.assertEquals(Long.valueOf(4), result.get(2));
    }
}

Upvotes: 9

Andrew Petryk
Andrew Petryk

Reputation: 239

Well, for that you can try to use Map

Map<Integer, Integer> countMap = new HashMap<>();

  for (Integer item: yourArrayList) {

      if (countMap.containsKey(item))
          countMap.put(item, countMap.get(item) + 1);
      else
          countMap.put(item, 1);
  }

After end of forEach loop you will have a filled map with your items against it count

Upvotes: 7

Related Questions