猿问

如何从多个列表创建匹配对象的列表并删除匹配列表中的对象以使其反映在原始列表中

如果有人问过这个问题,我很抱歉,但我无法从谷歌搜索中找到类似的内容,所以就到这里。假设我有两个对象


笔记本


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);

            }

        }

    }


但是,我现在希望能够从匹配注释列表中删除注释,以便原始笔记本中的注释也被删除。


存储和搜索这两个类的最佳方法是什么,以便我可以实现这样的功能。


编辑:


只是为了澄清,最终结果是我希望用户能够在所有笔记本中搜索笔记类别,然后程序将返回与该类别匹配的笔记列表。然后,他/她可以从该列表中删除笔记,这样它也会在原始笔记本中删除。例如,完全从程序中删除。


素胚勾勒不出你
浏览 117回答 3
3回答

慕码人2483693

迭代器:可能是最简单的解决方案。由于 java 在循环中使用迭代器foreach,因此性能是相同的。For (NoteBook noteBook: noteBooks) {&nbsp; Iterator<Note> it = noteBooks.getNoteList().iterator();&nbsp; while (it.hasNext()) {&nbsp; &nbsp; Note note = it.next();&nbsp; &nbsp; if (note.getCategory().equals(someString)) {&nbsp; &nbsp; &nbsp; it.remove();&nbsp; &nbsp; }&nbsp; }}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) {&nbsp; for (NoteBook noteBook: noteBooks) {&nbsp; &nbsp; Iterator<Note> it = noteBooks.getNoteList().iterator();&nbsp; &nbsp; while (it.hasNext()) {&nbsp; &nbsp; &nbsp; Note note = it.next();&nbsp; &nbsp; &nbsp; if (note.getName().contains(removedName)) {&nbsp; &nbsp; &nbsp; &nbsp; it.remove();&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; }}

繁星点点滴滴

为什么不将笔记本信息存储在 note 类中呢?public class Note {&nbsp; &nbsp; private NoteBook sourceNoteBook;&nbsp; &nbsp; private String name;&nbsp; &nbsp; private String category;&nbsp; &nbsp; private String details;&nbsp; &nbsp; public Note(NoteBook sourceNoteBook,String name, String category, String details) {&nbsp; &nbsp; &nbsp; &nbsp; this.sourceNoteBook = sourceNoteBook;&nbsp; &nbsp; &nbsp; &nbsp; this.name = name;&nbsp; &nbsp; &nbsp; &nbsp; this.category = category;&nbsp; &nbsp; &nbsp; &nbsp; this.details = details;&nbsp; &nbsp; }}需要注意的每个数据操作都会影响存储它的笔记本

呼啦一阵风

当键是笔记并且值是笔记本时,您可以创建一个地图 keySet 将返回给用户,一旦他选择了该键,您就有了知道要从哪个笔记本中删除的值,并且您有可以删除该笔记本的键笔记。这是你的意思吗?
随时随地看视频慕课网APP

相关分类

Java
我要回答