Home > Back-end >  Scanner input and array duplicates verification causes an infinite loop
Scanner input and array duplicates verification causes an infinite loop

Time:09-29

I code a program that lists entered names. But if the entered name is already in the array, the user has to reenter a different name.

I left a picture below that shows what is happening when I run the code

import java.util.Scanner;

public class list {
    public static void main(String[] args) {
        int numberofhumans;
        Scanner al = new Scanner(System.in);
        System.out.print("Enter the number of person: ");
        numberofhumans = al.nextInt();

        String[] list = new String[numberofhumans];
        for (int i = 0; i < numberofhumans; i  ) {
            System.out.print("Enter the name:");
            list[i] = al.nextLine();

            for (int j = 0; j < i; j  ) {
                if (list[i] == list[j]) {
                    System.out.println("Name you just typed is already in your list. Enter a different name.");
                    i--;
                }
            }

        }

        for (String string : list) {
            System.out.println(string);
        }
        al.close();
    }
}

1

CodePudding user response:

Your issue is this line:

if (list[i] == list[j])

This checks if the 2 objects are equal, which they are not even if their content is the same. You need to use .equals method of String object to compare 2 strings. That should fix the problem:

if (list[i].equals(list[j]))

I would rather use a Set of String instead of an array for a better performance since you won't have to iterate over and over again for each new input. Something like:

    Set<String> set = new HashSet<>();
    for (int i = 0; i < numberofhumans; i  ) {
        System.out.print("Enter the name: ");
        String name = al.nextLine();
        while (set.contains(name)) {
           System.out.println("Name you just typed is already in your list. Enter a different name.");
           System.out.print("Enter the name: ");
           name = al.nextLine();
        }
        set.add(name);
     }

CodePudding user response:

Looking into your code, i found that you are using al.nextLine() which can return an empty String if the previous element the Scanner gave you was not a whole line. This is why you get prompted twice to enter a name when you run your program. See this post for further details.

Solution: use al.next() instead.

You are also comparing two String with the == operator which is comparing their adresses in memory. This comparison will always return false

Here is as working program:

import java.util.Scanner;

public class main {
    public static void main(String[] args) {
        int numberofhumans;
        Scanner al = new Scanner(System.in);
        System.out.print("Enter the number of person: ");
        numberofhumans = al.nextInt();

        String[] list = new String[numberofhumans];
        for (int i = 0; i < numberofhumans; i  ) {
            System.out.print("Enter the name:");
            list[i] = al.next();

            for (int j = 0; j < i ; j  ) {
                if (list[i].equals(list[j])) {
                    System.out.println("Name you just typed is already in  your list. Enter a different name.");
                i--;
            }
        }

    }

    for (String string : list) {
        System.out.println(string);
    }
    al.close();
}
  • Related