Как создать список подходящих объектов из нескольких списков и удалить объекты в списке совпадений так, чтобы он отражался в исходном списке - PullRequest
1 голос
/ 22 сентября 2019

Извините, если это было задано, но я не смог найти что-то похожее в поиске Google, так что здесь идет.Скажем, у меня есть два объекта

Записная книжка

public class NoteBook {
    private String name;
    private String description;

    public NoteBook(String name, String description) {
        this.name = name;
        this.description = description;
    }
}

и заметки

public class Note {
    private String sourceNoteBook
    private String name;
    private String category;
    private String details;

    public Note(String sourceNoteBook,String name, String category, String details) {
        this.sourceNoteBook = sourceNoteBook;
        this.name = name;
        this.category = category;
        this.details = details;
    }
}

В программе пользователь может создать несколько объектов NoteBook, и каждый NoteBook хранит переменнуюколичество нот.В конечном счете, я хотел бы добавить функцию поиска, которая может искать заметки по категории или имени и возвращать список найденных заметок.

Обычно я бы использовал циклы 2 For для перебора списка записных книжек, а затем переборапросмотрите список заметок для каждой записной книжки и сравните строки.что-то вроде этого:

    For (NoteBook noteBook: noteBooks) {
        For(Note note :noteBooks.getNoteList){
            if (note.getCategory().contains(someString)) {
                matchingNotes.add(notes);
            }
        }
    }

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

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

РЕДАКТИРОВАТЬ:

Просто для пояснения,В результате я бы хотел, чтобы пользователь мог искать категорию заметок во всех записных книжках, после чего программа выдаст список заметок, соответствующих этой категории.Затем он / она может удалить заметку из этого списка, чтобы она также была удалена в исходной записной книжке.Например, полностью удален из программы.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2019

изменить мой ответ

вы можете создать карту, когда ключом является примечание, а значением является ключ ноутбука. Набор будет возвращен пользователю, и как только он выберет ключ, у вас есть значение, которое необходимо узнать из какого ноутбука.удалить, и у вас есть ключ, который вы можете удалить заметку.Это то, что вы имели в виду?

0 голосов
/ 22 сентября 2019

Почему бы вам просто не сохранить информацию о записной книжке в классе заметок?

public class Note {
    private NoteBook sourceNoteBook;
    private String name;
    private String category;
    private String details;

    public Note(NoteBook sourceNoteBook,String name, String category, String details) {
        this.sourceNoteBook = sourceNoteBook;
        this.name = name;
        this.category = category;
        this.details = details;
    }
}

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

0 голосов
/ 22 сентября 2019

Итератор:
Вероятно, самое простое решение.А поскольку java использует итераторы внутри циклов foreach, производительность будет одинаковой.

For (NoteBook noteBook: noteBooks) {
  Iterator<Note> it = noteBooks.getNoteList().iterator();
  while (it.hasNext()) {
    Note note = it.next();
    if (note.getCategory().equals(someString)) {
      it.remove();
    }
  }
}

SQL:
Это будет оптимальным.Однако даже использование чего-то более легкого, такого как H2 или SQLite, потребует рефакторинга.А также не подходит для очень легких приложений.

Эффективно:
Если вы осуществляете поиск только по категории или названию, вы можете использовать 2 карты:

Map<String, Note> notesByCategory;
Map<String, Note> notesBytName

Это потребует O(n) памяти для хранения карт, но будет иметь очень эффективный поиск в O(1) времени (по сравнению с текущим O (n) ).Я бы избежал этого решения , потому что очень легко достичь незаметного состояния между содержимым заметок и карт.

РЕДАКТИРОВАТЬ:

var newNoteNames = newList.stream().map(Note::getName).collect(Collectors.toSet());
var oldNoteNames = noteBooks.stream().flatMap(Notebook::getNodeList).map(Note::getName).collect(Collectors.toSet());

var removedNames = oldNoteNames.removeAll(newNoteNames);

for (var removedName : removedNames) {
  for (NoteBook noteBook: noteBooks) {
    Iterator<Note> it = noteBooks.getNoteList().iterator();
    while (it.hasNext()) {
      Note note = it.next();
      if (note.getName().contains(removedName)) {
        it.remove();
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...