Reputation: 381
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
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
Reputation: 399
general algorithm
define a empty set of type element, counter int variable pair=0.
// 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
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
Reputation: 1129
use Collections.frequency
method to count the duplicates
Upvotes: 12
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
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
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
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
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
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
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
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
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