Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding duplicate and non duplicate in Java

I know this question has been answered on "how to find" many times, however I have a few additional questions. Here is the code I have

public static void main (String [] args){

    List<String> l1= new ArrayList<String>();

    l1.add("Apple");
    l1.add("Orange");
    l1.add("Apple");
    l1.add("Milk");

    //List<String> l2=new ArrayList<String>();
    //HashSet is a good choice as it does not allow duplicates
    HashSet<String> set = new HashSet<String>();

    for( String e: l1){

        //if(!(l2).add(e)) -- did not work
        if(!(set).add(e)){
            System.out.println(e);
        }

Question 1:The list did not work because List allows Duplicate while HashSet does not- is that correct assumption?

Question 2: What does this line mean: if(!(set).add(e)) In the for loop we are checking if String e is in the list l1 and then what does this line validates if(!(set).add(e))

This code will print apple as output as it is the duplicate value.

Question 3: How can i have it print non Duplicate values, just Orange and Milk but not Apple? I tried this approach but it still prints Apple. List unique= new ArrayList(new HashSet(l1));

Thanks in advance for your time.

like image 869
Sheikh Rahman Avatar asked Dec 14 '22 02:12

Sheikh Rahman


1 Answers

1) Yes that is correct. We often use sets to remove duplicates.

2) The add method of HashSet returns false when the item is already in the set. That's why it is used to check whether the item exists in the set.

3) To do this, you need to count up the number of occurrances of each item in the array, store them in a hash map, then print out those items that has a count of 1. Or, you could just do this (which is a little dirty and is slower! However, this approach takes a little less space than using a hash map.)

List<String> l1= new ArrayList<>();

l1.add("Apple");
l1.add("Orange");
l1.add("Apple");
l1.add("Milk");

HashSet<String> set = new HashSet<>(l1);

for (String item : set) {
    if (l1.stream().filter(x -> !x.equals(item)).count() == l1.size() - 1) {
        System.out.println(item);
    }
}
like image 61
Sweeper Avatar answered Dec 16 '22 15:12

Sweeper