Как я могу удалить объекты по атрибуту в связанном списке? - PullRequest
0 голосов
/ 09 января 2019

Как я могу удалить объект внутри списка ссылок. У меня есть учетная запись класса с studentId и studentName. Я ввожу объекты в список, но когда я пытаюсь удалить, я не знаю, как это сделать. Потому что каждый раз, когда вы удаляете элемент из середины списка, он организуется, то есть индексы меняются. Итак, как я могу получить атрибут studentId и удалить объект внутри connectedList.

Образец:

LinkedList: Account{studentId = 1, studentName = nome1} = index = 0 , 
LinkedList: Account{studentId = 2, studentName = nome2} = index = 1 , 
LinkedList: Account{studentId = 3, studentName = nome3} = index = 2.

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

public Account{
    private int studentID;
    private String StudentName;
}

public static void main(String[] args){

    int accountNumber;

    LinkedList<Account> linkedAccount = new LinkedList<>();
    Account obj1;

    System.out.println("Type the acc number: ");
    accountNumber = in.nextInt();
    obj1 = linkedAccount.remove(accountNumber);
    System.out.println("The " + obj1 + " has been deleted");
}

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

Ответы [ 3 ]

0 голосов
/ 09 января 2019
  1. Если вам не нужно сохранять ссылку на удаляемый объект, вы можете просто

    linkedAccount.removeIf(acc -> acc.getStudentID() == accountNumber);
    
  2. Если вы хотите сохранить ссылку на удаляемый элемент, вы можете

    for (Account acc : linkedAccount) {
        if (acc.getStudentID() == accountNumber) {
            obj1 = acc;
            linkedAccount.remove(acc);
            break;
        }
    }
    
    // OR
    
    for (int i = 0; i < linkedAccount.size(); i++) {
        if (linkedAccount.get(i).getStudentID() == accountNumber) {
            obj1 = linkedAccount.remove(i);
            break;
        }
    }
    
  3. Обратите внимание, что в большинстве случаев и в основном достаточно ArrayList Когда использовать LinkedList вместо ArrayList в Java?

0 голосов
/ 09 января 2019

Я думаю, что лучший вариант - найти учетную запись в списке по идентификатору студента, а затем удалить ее.

public Account{
    private int studentID;
    private String StudentName;

    public int getStudentID() {
       return this.studentID;
    }
}

public static void main(String[] args){

   int accountNumber;

   LinkedList<Account> linkedAccount = new LinkedList<>();
   Account obj1;

   System.out.println("Type the acc number: ");
   accountNumber = in.nextInt();
   for (int i = 0; i < linkedAccount.size(); i++) {
      if (accountNumber == linkedAccount.get(i).getStudentID()) {
         System.out.println("The student " + linkedAccount.get(i).getStudentID() + " has been deleted");
         linkedAccount.remove(i);
         break; // This is to exit for loop, but if you want to delete every instance in the list with this ID you can skip this break
      }
   }
}
0 голосов
/ 09 января 2019

В настоящее время вы используете accountNumber в качестве неверного индекса, вместо этого переберите список по списку, найдите индекс объекта и затем удалите:

for (int i = 0; i < linkedAccount.size(); i++) {
     if (linkedAccount.get(i).getStudentID() == accountNumber) {
         obj1 = linkedAccount.remove(i);
         break;
     }
}

Далее, почему вы используете LinkedList вместо ArrayList? последнее почти всегда благоприятно.

...