Given an ArrayList with duplicate values, the task is to remove the duplicate values from this ArrayList in Java.
Examples:
Input: List = [1, 10, 2, 2, 10, 3, 3, 3, 4, 5, 5]
Output: List = [1, 10, 2, 3, 4, 5]
Input: List = ["G", "e", "e", "k", "s"]
Output: List = ["G", "e", "k", "s"]
-
Using Iterator
Approach:
- Get the ArrayList with duplicate values.
- Create another ArrayList.
- Traverse through the first arraylist and store the first appearance of each element into the second arraylist using contains() method.
- The second ArrayList contains the elements with duplicates removed.
Below is the implementation of the above approach:
import java.util.*;
public class GFG {
public static <T> ArrayList<T> removeDuplicates(ArrayList<T> list)
{
ArrayList<T> newList = new ArrayList<T>();
for (T element : list) {
if (!newList.contains(element)) {
newList.add(element);
}
}
return newList;
}
public static void main(String args[])
{
ArrayList<Integer>
list = new ArrayList<>(
Arrays
.asList( 1 , 10 , 1 , 2 , 2 , 3 , 3 , 10 , 3 , 4 , 5 , 5 ));
System.out.println( "ArrayList with duplicates: "
+ list);
ArrayList<Integer>
newList = removeDuplicates(list);
System.out.println( "ArrayList with duplicates removed: "
+ newList);
}
}
|
Output:
ArrayList with duplicates: [1, 10, 1, 2, 2, 3, 3, 10, 3, 4, 5, 5]
ArrayList with duplicates removed: [1, 10, 2, 3, 4, 5]
-
Using LinkedHashSet
A better way (both time complexity and ease of implementation wise) is to remove duplicates from an ArrayList is to convert it into a Set that does not allow duplicates. Hence LinkedHashSet is the best option available as this do not allows duplicates as well it preserves the insertion order.
Approach:
- Get the ArrayList with duplicate values.
- Create a LinkedHashSet from this ArrayList. This will remove the duplicates
- Convert this LinkedHashSet back to Arraylist.
- The second ArrayList contains the elements with duplicates removed.
Below is the implementation of the above approach:
import java.util.*;
public class GFG {
public static <T> ArrayList<T> removeDuplicates(ArrayList<T> list)
{
Set<T> set = new LinkedHashSet<>();
set.addAll(list);
list.clear();
list.addAll(set);
return list;
}
public static void main(String args[])
{
ArrayList<Integer>
list = new ArrayList<>(
Arrays
.asList( 1 , 10 , 1 , 2 , 2 , 3 , 10 , 3 , 3 , 4 , 5 , 5 ));
System.out.println( "ArrayList with duplicates: "
+ list);
ArrayList<Integer>
newList = removeDuplicates(list);
System.out.println( "ArrayList with duplicates removed: "
+ newList);
}
}
|
Output:
ArrayList with duplicates: [1, 10, 1, 2, 2, 3, 10, 3, 3, 4, 5, 5]
ArrayList with duplicates removed: [1, 10, 2, 3, 4, 5]
-
Using Java 8 Stream.distinct()
You can use the distinct() method from the Stream API. The distinct() method return a new Stream without duplicates elements based on the result returned by equals() method, which can be used for further processing. The actual processing of Stream pipeline starts only after calling terminal methods like forEach() or collect().
Approach:
- Get the ArrayList with duplicate values.
- Create a new List from this ArrayList.
- Using Stream().distinct() method which return distinct object stream.
- convert this object stream into List
Below is the implementation of the above approach:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class GFG
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<>(
Arrays.asList( 1 , 10 , 1 , 2 , 2 , 3 , 10 , 3 , 3 , 4 , 5 , 5 ));
System.out.println( "ArrayList with duplicates: "
+ list);
List<Integer> newList = list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println( "ArrayList with duplicates removed: "
+ newList);
}
}
|
Output:
ArrayList with duplicates: [1, 10, 1, 2, 2, 3, 10, 3, 3, 4, 5, 5]
ArrayList with duplicates removed: [1, 10, 2, 3, 4, 5]