Поиск и замена элементов в связанном списке - PullRequest
4 голосов
/ 14 марта 2012

Мне нужно иметь возможность искать в связанном списке определенные уникальные элементы (имя пользователя, пароль, адрес электронной почты), и после нахождения этих элементов мне нужно перейти к следующему узлу в списке и начать серию утверждений, позволяющих пользователям изменять информация профиля. По какой-то причине мой код просто не работает, и я понятия не имею, как это исправить. Любая помощь будет отличной!

Как выглядит GUI

GUI

Ссылка на класс учетной записи: http://pastebin.com/jnBrcnP1

Таким образом, Пользователь заполняет необходимую информацию и, если он хочет изменить информацию профиля, такую ​​как «Имя» или «Пол», он изменяет информацию, затем устанавливает ComboBox рядом с ним «Да», затем нажимает кнопку «Сохранить настройки». ».

Вот как выглядит связанный список:

tobi
tobi123
tobi@hotmail.com
tobi
Mixed Breed
Male
1-2
Virginia
Walking
peppy
peppy123
peppy@hotmail.com
peppy
Chihuahua
Male
5-6
Virginia
Eating

Вот мой код кнопки:

private void jButtonP1ActionPerformed(java.awt.event.ActionEvent evt) {                                          
    //New Linked List created from file
    LinkedList<Account> account = new LinkedList<Account>();

    try
    {
        read(account, "doggydates.txt");
    } catch (Exception e)
    {
        System.err.println(e.toString());
    }
        display(account);

    //user information
    String username = jTextFieldP3.getText();
    String password = jPasswordFieldP1.getText();
    String email = jTextFieldP4.getText();
    String name = jTextFieldP1.getText();
    String breed = (String) jComboBoxP4.getSelectedItem();
    String gender = (String) jComboBoxP3.getSelectedItem();
    String age = (String) jComboBoxP1.getSelectedItem();
    String state = (String) jComboBoxP2.getSelectedItem();
    String hobby = jTextFieldP2.getText();
    //change combo boxes
    String passchange = (String) jComboBoxP13.getSelectedItem();
    String emailchange = (String) jComboBoxP14.getSelectedItem();
    String namechange = (String) jComboBoxP6.getSelectedItem();
    String breedchange = (String) jComboBoxP7.getSelectedItem();
    String genderchange = (String) jComboBoxP8.getSelectedItem();
    String agechange = (String) jComboBoxP9.getSelectedItem();
    String statechange = (String) jComboBoxP10.getSelectedItem();
    String hobbychange = (String) jComboBoxP11.getSelectedItem();

    //cancel combo box
    String accountcancel = (String) jComboBoxP5.getSelectedItem();

    if(username.equals("") || password.equals("") || email.equals("")) // If password and username is empty > Do this >>>
    {
        jButtonP1.setEnabled(false);
        jTextFieldP3.setText("");
        jPasswordFieldP1.setText("");
        jTextFieldP4.setText("");
        jButtonP1.setEnabled(true);
        this.setVisible(true);
    }
    else
    {
        ListIterator<Account> itr = account.listIterator();
        while (itr.hasNext()) 
        {
            Account item = itr.next();
            if(item.getUsername().equals(username) && item.getPassword().equals(password))
            {

                if(passchange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.setDataAtCurrent(password);
                        }
                    }
                }

                if(emailchange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.goToNext();
                            acc.setDataAtCurrent(email);
                        }
                    }
                }

                if(namechange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.setDataAtCurrent(name);
                        }
                    }
                }

                if(breedchange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.setDataAtCurrent(breed);
                        }
                    }
                }

                if(genderchange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.setDataAtCurrent(gender);
                        }
                    }
                }

                if(agechange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.setDataAtCurrent(age);
                        }
                    }
                }

                if(statechange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.setDataAtCurrent(state);
                        }
                    }
                }

                if(hobbychange.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.goToNext();
                            acc.setDataAtCurrent(hobby);
                        }
                    }
                }                    

                if(accountcancel.equals("Yes"))
                {    
                    for(Account acc : account){
                        if(acc.getUsername().equals(username)){
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                            acc.goToNext();
                            acc.deleteCurrentNode();
                        }
                    }
                }  

            }
        }

        String file_name = "doggydates.txt";
        try {
                FileWriter fstream = new FileWriter(file_name);
                BufferedWriter out = new BufferedWriter(fstream);

                ListIterator itr2 = account.listIterator();
                while (itr2.hasNext()) {
                    Account element = (Account) itr2.next();
                    out.write("" + element);
                    out.newLine();
                }
                out.close();
                System.out.println("File created successfully.");

        } catch (Exception e) {
        }

    }
}                                         

Метод чтения:

public static void read(LinkedList<Account> account, String inputFileName) throws java.io.IOException{
    BufferedReader infile = new BufferedReader(new FileReader(inputFileName));
    while(infile.ready())
    {        
    String username = readLine(infile);
    String password = readLine(infile);
    String email = readLine(infile);
    String name = readLine(infile);
    String breed = readLine(infile);
    String gender = readLine(infile);
    String age = readLine(infile);
    String state = readLine(infile);
    String hobby = readLine(infile);

    Account a = new Account(username, password, email, name, breed, gender, age, state, hobby);
    account.add(a);
    a.showList();
    }
    infile.close();
}

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Глядя на свой код, вы делаете это:

Во-первых, LinkedList<Account> account = new LinkedList<Account>(); это означает, что вы создаете список каждый раз, когда пользователь нажимает кнопку Сохранить настройки .

Второе, ListIterator<Account> itr = account.listIterator();, но аккаунт - это пустой список! Таким образом, вы не можете сравнивать какой-либо один объект с данными ваших людей.

И последнее, но не менее важное: read(account, "doggydates.txt"); Я полагаю, вы читаете данные файла и заполняете свой список после того, как все сравнения сделаны.

Реорганизуйте свой код и повторите попытку.

UPDATE: Просмотрев весь ваш код, я обнаружил некоторые проблемы в вашем дизайне:

  1. Account класс - это ваша сущность. Этот класс должен иметь данные для вашего списка. Вы можете использовать этот класс как узел LinkedList, указав указатель на другую Account ссылку на объект, не нужно использовать ListNode экземпляр.
  2. Для реализации LinkedList вы используете класс Account. Но это внутри LinkedList<Account>, поэтому у вас есть LinkedList из LinkedList. Я думаю, вы не хотите такого поведения.

Вы можете изменить свой дизайн на что-то более простое. Я дам вам 2 образца для вашего дизайна:

Форма 1. Использование класса Acount в качестве узла LinkedList.

public class Account {

    private Account next;
    private Account previous;
    private String username;
    private String password;
    private String email;
    private String name;
    private String breed;
    private String gender;
    private String age;
    private String state;
    private String hobby;

    //constructor logic...

    //getters and setters...

    //toString method (for System.out.println)
}

public class AccountLinkedList {
    private Account head;
    private int size;
    public AccountLinkedList() {
        this.size = 0;
        this.head = null;
    }
    public boolean insert(Account account) {
        if (this.head == null) {
            this.head = account;
        } else {
            Account current = head;
            while (current.getNext() != null) {
                current = current.getNext();
            }
            //maintain the LinkedList order
            current.setNext(account);
            account.setPrevious(current);
        }
    }
    public Account findAccount(Account account) {
        Account current = head;
        while (current != null) {
            if (current.equals(account) {
                return current;
            }
            current = current.getNext();
        }
        return null;
    }
    //create the other methods to search, delete and traverse your list...
}

public class MyProgram {
    public void jButtonP1ActionPerformed(java.awt.event.ActionEvent evt) {
        Account account = new Account();
        //set the account data, I'll just stick to username and
        //password attributes
        String username = jTextFieldP3.getText();
        String password = jPasswordFieldP1.getText();
        account.setUsername(username);
        account.setPassword(password);
        //perform the update
        updateData();
    }
    public void updateData(Account account) {
        AccountLinkedList accountList = new AccountLinkedList;
        //loading data into our list
        loadDataFromFile(accountList, "myFile.txt");
        //perform the search operation
        Account accountAux = accountList.findAccount(account);
        //if the account is found, then update the accountAux data
        if (accountAux != null) {
            updateAccountData(accountAux, account);
        } else {
            accountList.insert(account);
        }
        //saving the modified data
        saveDataToFile(accountList, "myFile.txt");
    }
}

Форма 2. Используйте класс Account как сущность и используйте реализацию Java LinkedList:

//check that now you don't have the next and previous attributes
public class Account {

    private String username;
    private String password;
    private String email;
    private String name;
    private String breed;
    private String gender;
    private String age;
    private String state;
    private String hobby;

    //constructor logic...

    //getters and setters...

    //toString method (for System.out.println)
}

public class MyProgram {
    public void jButtonP1ActionPerformed(java.awt.event.ActionEvent evt) {
        Account account = new Account();
        //set the account data, I'll just stick to username and
        //password attributes
        String username = jTextFieldP3.getText();
        String password = jPasswordFieldP1.getText();
        account.setUsername(username);
        account.setPassword(password);
        //perform the update
        updateData();
    }
    public void updateData(Account account) {
        LinkedList<Account> accountList = new LinkedList<Account>();
        //loading data into our list
        loadDataFromFile(accountList, "myFile.txt");
        //perform the search operation
        ListIterator<Account> li = accountList.listIterator();
        Account accountAux = null;
        while(li.hasNext()) {
            accountAux = li.next();
            //matching the account data outside with the current account
            //of the list iterator, this is just a sample, you can change
            //this logic
            if (accountAux.equals(account) {
                updateAccountData(accountAux, account);
                break;
            }
            accountAux = null;
        }
        //in case the account was not fount in the LinkedList, add it.
        if (accountAux == null)
            accountList.add(account);
        //saving the modified data
        saveDataToFile(accountList, "myFile.txt");
    }
}

IMO, я буду придерживаться формы 2 вместо формы 1. Надеюсь, это поможет вам.

0 голосов
/ 14 марта 2012

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

Опция, которую вы можете захотеть: У вас есть связанный список учетных записей, для вашего примера в связанном списке должно быть два объекта Account.

LinkedList<Account> accounts = new LinkedList<Account>();
load(accounts, file);

, который должен иметь два объекта {tobiaccount, peppyaccount}, вам нужно написать здесь функцию загрузки, это другой вопрос.

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

Тогда у вас будет список ссылок из списков ссылок (аккаунтов)

{
   {tobi, tobi123, tobi@hotmail.com, tobi, Mixed Breed, Male, 1-2, Virginia, Walking},
   {peppy, peppy123, peppy@hotmail.com, peppy, Chihuahua, Male, 5-6, Virginia, Eating}
}

Если вы хотите пойти по этому пути, вам следует подумать об упрощении класса вашей учетной записи и убедиться, что список внутри него заполнен правильно.

ОДНАКО , это все еще не очень хороший дизайн, если вы не делаете странную домашнюю работу о связанных списках.

Оптимальным дизайном будет использование одного связанного списка, а не вложенного; помещение учетных записей в связанный список и доступ к каждому параметру с помощью методов set / get, которые вы уже используете в классе Account.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...