Jack
Jack

Reputation: 19

N times problem while iterating through loop in Duplicate element program

import java.util.*;
public class TestClass {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    String[] val = new String[n];
    scan.nextLine();
    for (int i = 0; i < n; i++) {
      val[i] = scan.nextLine();
    }
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        if (val[i].equals(val[j])) {
          System.out.println(val[i]);
        }
      }
    }
  }
}

This is a simple code for finding duplicate array value but I need an else part where it should print "No duplicate found" but the problem is as I am iterating it through a loop it's printing N times the output.

INPUT

cat 
dog 
frog
owl

OUTPUT

No duplicate found

Upvotes: 0

Views: 93

Answers (2)

Ajay Singh Pundir
Ajay Singh Pundir

Reputation: 276

Can we use something like this

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors;

public class TestClass
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String[] val = new String[n];
        scan.nextLine();
        for (int i = 0; i < n; i++)
        {
            val[i] = scan.nextLine();
        }
        boolean dups = false;
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (val[i].equals(val[j]))
                {
                    System.out.println(val[i]);
                } else
                {
                    dups = true;
                }
            }
        }
        if (dups)
        {
            System.out.println("no duplicate found");
        }
        if (findDups(val))
        {
            System.out.println("no duplicate found");
        }
        if (findDups(Arrays.asList(val)))
        {
            System.out.println("no duplicate found");
        }
    }

    // different approach to avoid nested loops
    public static boolean findDups(String[] arr)
    {
        Set<String> set = new HashSet<>();
        for (String i : arr)
        {
            if (set.contains(i))
            {
                return false;
            } else
            {
                set.add(i);
            }
        }
        return true;
    }

// Java 8 streams
    public static boolean findDups(List<String> list)
    {

        return list.stream().filter(i -> Collections.frequency(list, i) > 1)
            .collect(Collectors.toSet()).isEmpty();

    }
    
}

Upvotes: 1

DarrenChand
DarrenChand

Reputation: 116

you can have a check variable for example

        boolean duplicatefound = false;
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (val[i].equals(val[j]))
                {
                    System.out.println(val[i]);
                    duplicatefound = true;
                }
            }
        }

        if(duplicatefound)
        {
            System.out.println("duplicate found");
        }else
        {
            System.out.println("No Duplicated found");
        }

Upvotes: 1

Related Questions