Noneyabees Ответов: 2

Как я могу закодировать свою программу, чтобы строки, которые у меня есть в моем arraylist, действительно были удалены?


Поэтому я создал программу, в которой пользователь будет вводить пароль и имя пользователя. Программа возьмет текстовый файл, в котором хранится эта информация, и преобразует его в arraylist. Как только информация будет проверена, это имя пользователя и пароль будут удалены из списка arraylist. Пользователь не сможет снова войти в систему, если только программа не будет перезапущена.

Моя проблема заключается в том, что информация о пользователях никогда не удаляется из списка arraylist.

Вот мой код:
import java.io.*;
import java.util.*;
public class LoginPagev2
{
	public static void main(String[] args) throws IOException
	{
		String answ;
		String user;
		String pass ;
		int counter = 0;
		Scanner keyboard = new Scanner(System.in);
		System.out.println("Welcome! This program will allow you to sign in with a username and password you created.");
		System.out.println("If you fail to login correctly 3 times, this program will terminate. You can only sign in once per username.");
		System.out.println("If you wish to sign in into the same account twice, you must restart the program.");
		while(true)
		{	System.out.print("Would you like to sign in? (Y/N): ");
			answ = keyboard.nextLine();
			if(answ.equalsIgnoreCase("N"))
			{
				System.out.print("Goodbye!");
				System.exit(0);
			}
			System.out.print("What is your username?: " );
			user = keyboard.nextLine();
			System.out.print("What is your password?: ");
			pass = keyboard.nextLine();
			while((!list().contains(user) || !list().contains(pass)) || counter < 3)
			{
				++ counter;
				if(list().contains(user) && list().contains(pass))
				{
						list().remove(user);
						list().remove(pass);
						System.out.println("Congrats! You successfully signed in!");
						counter = 0;
						break;
				}
				if(counter==3)
				{
					System.out.println("You have attempted you max amount of tries. This program will now end.");
					System.exit(0);
				}
				else
				{
					System.out.println("This is not valid. Please try again");
					System.out.print("What is your username?: " );
					user = keyboard.nextLine();
					System.out.print("What is your password?: ");
					pass = keyboard.nextLine();
				}
			}
			System.out.print("Would you like to sign in with another account? (Y/N): ");
			String rep = keyboard.nextLine();
			if(rep.equalsIgnoreCase("N"))
			{
				System.out.print("Goodbye!");
				System.exit(0);
			}
			else
				continue;
		}
		
	}			
	
	public static ArrayList<String> list() throws IOException
	{
		try
		{
			BufferedReader reader = new BufferedReader(new FileReader("loginInfo.txt"));
			String line;
			ArrayList<String> arr = new ArrayList<String> ();
			while ((line = reader.readLine()) != null) 
			{
				arr.add(line);
			}
			reader.close();
			return arr;
		}catch(Exception e)
		{
			return null;
		}
	}
	
}


Что я уже пробовал:

Я действительно не знаю, как исправить эту проблему, поэтому я действительно ничего не пробовал.

2 Ответов

Рейтинг:
2

#realJSOP

Это происходит потому, что вы повторно создаете экземпляр списка каждый раз, когда вызываете метод list.


Рейтинг:
0

OriginalGriff

Каждый раз, когда вы звоните list вы создаете новый ArrayList и добавьте к нему информацию о пользователе:

	public static ArrayList<String> list() throws IOException
	{
...
			ArrayList<String> arr = new ArrayList<String> ();
			while ((line = reader.readLine()) != null) 
			{
				arr.add(line);
			}
			reader.close();
			return arr;
...
	}
Поэтому каждый раз, когда вы используете его, вы получаете информацию одного пользователя, а затем выбрасываете ее!
В результате пользователь никогда не будет в коллекции в следующий раз, когда вы попытаетесь его найти!

Вам нужно сделать одно из двух:
1) Создайте ArrayList на уровне класса (вне любого метода) и используйте его вместо создания нового в list
Или
2) Создайте ArrayList в main и передайте его кому-нибудь. list каждый раз, когда ты звонишь.

Но... вы действительно делаете это очень, очень неправильно.
Сохраняя имена пользователей и пароли в одной коллекции, вы не можете сказать, вхожу ли я в систему как мой пароль с помощью имени пользователя или вхожу как мое имя пользователя с вашим паролем! Потому что ваш поиск найдет совпадение, если он найдет любую строку: если я создам пользователя "Griff" с паролем "Original", а вы сделаете то же самое с "Noney" и "Abees", любой может войти в систему с любой комбинацией:
Griff    Original
Griff    Griff
Griff    Noney
Griff    Abees
Original Original
Original Griff
Original Noney
Original Abees
Noney    Original
Noney    Griff
Noney    Noney
Noney    Abees
Abees    Original
Abees    Griff
Abees    Noney
Abees    Abees
Все они будут действительными комбинациями для успешного входа в систему.
Что вам нужно сделать, если создать либо отдельные коллекции для имен и паролей и сравнить пароль только с тем же индексом, что и требуемое имя пользователя; или лучше создать класс пользователя, который содержит имя пользователя и пароль, а затем искать его в вашей коллекции вместо "необработанных строк".