'searching in arraylist always not found

no matter what I use indexof() or contains or .equals() changing everything to uppercase or to lowercase It always return false and not found can someone please tell me what is going on?


class Students{
    private ArrayList<String> snames;
    private String tname;
//this one combines both question 2 and 4.    
public Students(String tname){
    
snames=new ArrayList<>();
this.tname=tname;
    

}    
    
    
public String gettname(){return tname;}
public ArrayList<String> getsnames(){return snames;}

public void addStudent(String name){
    snames.add(name);
    
    
    
    
}

    
public boolean studentExists(String name){

boolean e=false;
for(String i:snames){
if(i.contains(name)){
    
    e=true;

}   
}
return e;    
}    
    
    
    
}
public class Main
{
    public static void main(String[] args) throws IOException{

Scanner k=new Scanner(System.in);
out.println("what is your name?");
String name=k.nextLine();
out.println(name.toUpperCase());
Students s=new Students(name);
out.println("enter student name");
String snames=k.nextLine();
while(snames!="."){
     out.println("enter student name");
snames=k.nextLine();    
s.addStudent(snames);    
if (snames.equals("."))    
break;
}       
out.println("who u want to find");
String target=k.nextLine();

boolean exist=s.studentExists(target);

if(exist==true){
out.println("Found student");
}
else out.println("Student not found.");
out.println(exist);     
}
    

    
    
}

no matter what I use indexof() or contains or .equals() changing everything to uppercase or to lowercase It always return false and not found can someone please tell me what is going on?



Solution 1:[1]

You have a logic issue...

out.println("enter student name");
String snames = k.nextLine();
while (snames != ".") {
    out.println("enter student name");
    snames = k.nextLine();
    s.addStudent(snames);
    if (snames.equals(".")) {
        break;
    }
}

You...

  1. Prompt for the name
  2. Read the next line of input
  3. Check to see if it's the exit condition (by the way, snames != "." is wrong, it should be !".".equals(snames)
  4. You prompt them to enter the name
  5. You read the input
  6. You write the input to Students
  7. You check for the exit condition ... again

So, between 3 and 4, you never write what was first entered by the user, so, if you only enter

enter student name
jack
enter student name
.

Only . will be added to the list

Instead, you should be doing something more like...

Scanner scanner = new Scanner(System.in);
Students students = new Students("Test");

String name = ".";
do {
    System.out.print("enter student name (or \".\" to exit) ");
    name = scanner.nextLine();
    if (!name.equals(".")) {
        students.addStudent(name);
    }
} while (!name.equals("."));

do {
    System.out.print("who u want to find (or \".\" to exit) ");
    name = scanner.nextLine();
    if (!name.equals(".")) {
        if (students.studentExists(name)) {
            System.out.println("Match found");
        } else {
            System.out.println("Match not found");
        }
    }
} while (!name.equals("."));

The important point here is to make sure when you ask for input, you are actually writing it the list, unless it's the exit value (ie .)

Solution 2:[2]

The code is bad-structured, and the first snames is never added to the ArrayList.

See the codes below in class Main:

public static void main(String[] args) throws IOException { 
    // ignore the teacher name part
    Students s = new Students(name);
    // when the first snames is received,
    System.out.println("enter student name");
    String snames = k.nextLine();
    while (snames != ".") {
        // the name is not saved, but another snames is received.
        System.out.println("enter student name");
        snames = k.nextLine();
        System.out.println(snames);
        s.addStudent(snames);
        // the "." is also saved as well.
        if (snames.equals("."))
            break;
        }
    }
}

I would suggest modifying the while loop into something like this:

    Students student = new Students(tname);
    // no need to get scanner output before loop
    String sname;
    do {
        System.out.println("enter student name");
        sname = scanner.nextLine();
        System.out.println(sname);
        student.addStudent(sname);
    } while (!sname.equals("."));

Hope this answer helps you well.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 MadProgrammer
Solution 2